인프런 커뮤니티 질문&답변

kanghwan.cha님의 프로필 이미지
kanghwan.cha

작성한 질문수

[2024 최신] [코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

StatefulWidget Life Cycle 실습 - 1

StatefulWidget Life Cycle 질문

작성

·

127

0

안녕하세요!

StatefulWidget Life Cycle 실습 -1 ~ 3 강의 중 문의드립니다.

ElevatedButton을 통해 CodeFactory Class의 보이기/안보이기 기능중에서 CodeFactoryWidget의 생성자가 없는데도 실행이 되는게 잘 이해가 되지 않아서요..

예를들면 GestureDetector의 위젯 안에는 child: CodeFactoryWidget 생성자가 있는 부분이 다른 부분 같아서요..

setState를 거치게 되면 HomeScreen에 포함되어 있는 Widget은 전부 재실행이 되는건가요 ?

답변 2

0

kanghwan.cha님의 프로필 이미지
kanghwan.cha
질문자

위 코드 HomeScreen위젯의 ElevatedButton과 Codefactory위젯의 연동? 을 여쭤봤습니다 .

너무 초보라 질문이 서투네요 ㅠㅠ

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

서툰건 괜찮습니다. 초보때는 당연한거죠. 저는 질문을 정확히 파악하고 정확한 답변을 해드리고싶을뿐입니다!

아직도 정확히는 이해 못하겠어서 조금 더 소통 해봐요!

말씀하신 부분이 혹시 아래 스크린샷 부분 맞을까요?

image

"생성자가 없다"라고 생각하시는게 어떤 이유때문인지를 파악하고 있는데 프로그래밍상 생성자는 위 스크린샷이 맞습니다.

어떤 위치에 생성자가 없다고 생각하시는건지 말씀주시면 제가 더 자세히 설명 드리도록 할게요!

감사합니다!

kanghwan.cha님의 프로필 이미지
kanghwan.cha
질문자

Life cycle 에서 상태 변경 후에 build 함수가 재 실행된다는것을 자각하지 못했습니다 ㅠㅠ 강의를 듣다보니 이해가 돼서 며칠 지나서 답글 남깁니다!감사합니다 !

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

생성자가 없다는게 어떤 말씀이실까요?

모든 클래스는 생성자가 있습니다.

예제를 코드로 보여주시면 답변드리기 편할 것 같습니다.

감사합니다!

kanghwan.cha님의 프로필 이미지
kanghwan.cha
질문자

import 'package:flutter/material.dart';

class HomeScreen extends StatefulWidget {
  const HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  bool show = false;
  Color color = Colors.red;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SizedBox(
        width: double.infinity,
        // height: 10,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (show)
              GestureDetector(
                onTap: () {
                  setState(() {
                    color = color == Colors.blue ? Colors.red : Colors.blue;
                  });
                },
                child: CodeFactoryWidget(
                  color: color,
                ),
              ),
            SizedBox(height: 32.0),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  show = !show;
                  print('$show');
                });
              },
              child: Text('클릭해서 보이기/안보이기'),
            )
          ],
        ),
      ),
    );
  }
}

class CodeFactoryWidget extends StatefulWidget {
  final Color color;

  CodeFactoryWidget({
    super.key,
    required this.color,
  }) {
    print('1) Stateful Widget constructor');
  }

  @override
  State<CodeFactoryWidget> createState() {
    print('2) Stateful Widget Create State');
    return _CodeFactoryWidgetState();
  }
}

class _CodeFactoryWidgetState extends State<CodeFactoryWidget> {
  @override
  void initState() {
    print('3) Stateful Widget initState');
    super.initState();
  }

  @override
  void didChangeDependencies() {
    print('4) Stateful Widget didChageDependencies');
    super.didChangeDependencies();
  }

  // dirty

  @override
  Widget build(BuildContext context) {
    print('5) Stateful Widget build');
    return Container(
      color: widget.color,
      width: 50.0,
      height: 50.0,
    );
  }

  // clean

  @override
  void deactivate() {
    print('6) Stateful Widget deactivate');
    super.deactivate();
  }

  @override
  void dispose() {
    print('7) Stateful Widget dispose');
    super.dispose();
  }
  }
kanghwan.cha님의 프로필 이미지
kanghwan.cha

작성한 질문수

질문하기