ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Flutter_04. Rendering Contents conditionally
    > Frontend/Flutter 2023. 4. 19. 21:15

    1. Reformat.

    // quiz.dart contains contents MaterialApp
    import 'package:basic101_01/components/questions_screen.dart';
    import 'package:basic101_01/components/start_screen.dart';
    import 'package:flutter/material.dart';
    
    class Quiz extends StatefulWidget {
      const Quiz({super.key});
    
      @override
      State<Quiz> createState() {
        return _QuizState();
      }
    }
    
    class _QuizState extends State<Quiz> {
      Widget activeScreen = const StartScreen(); // able to store widgets in var
      void switchScreen() {
        setState(() {
          //QuestionScreen should follow StartScreen();
          activeScreen = const QuestionScreen();
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            body: Container(
              decoration: const BoxDecoration(
                gradient: LinearGradient(
                  colors: [
                    Color.fromARGB(255, 78, 13, 151),
                    Color.fromARGB(255, 107, 15, 168),
                  ],
                  begin: Alignment.topLeft,
                  end: Alignment.bottomRight,
                ),
              ),
              child: activeScreen,
            ),
          ),
        );
      }
    }
    

       - activeScreen이라는 var을 생성하여  추후에 버튼이 클릭시, StartScrenen Widget에서 QuestionScreen Widget으로 변경

     

    <QuestionScreen Widget> 

    // statefull widget
    
    import 'package:flutter/material.dart';
    
    class QuestionScreen extends StatefulWidget {
      const QuestionScreen({super.key});
    
      @override
      State<QuestionScreen> createState() {
        return _QuestionScreenState();
      }
    }
    
    class _QuestionScreenState extends State<QuestionScreen> {
      @override
      Widget build(BuildContext context) {
        return const Text('Question Screen');
      }
    }
    

     

     

    2. 버튼 연결

       - 순서 1. 화면을 변경해줄 switchScreen 이라는 변수는 quiz.dart에 있음으로, 해당 변수를 버튼이 있는 start_screen.dart로 전달

    Widget activeScreen = const StartScreen(switchScreen); // able to store widgets in var
    // switchScreen 에러 발생.
    void switchScreen() {
      setState(() {
        //QuestionScreen should follow StartScreen();
        activeScreen = const QuestionScreen();
      });
    }

       - 순서 2. start_screen.dart 에서 생성자에 this.startQuiz 등 원하는 변수명을 사용해 해당 변수를 받고, 선언

         :void Function() startQuiz를 받아만 왔고, 사용하기 위해 변수로 선언하지 않았기에,final void Function() startQuiz; 선언하고,          생성자와 연결 

    const StartScreen(this.startQuiz, {super.key}); // add positional argument
    // able to call switchScreen because it was passed
    
    final void Function() startQuiz;

     

       - 순서 3. 동일한 화면내에서, 버튼이 클릭될 경우, 함수 변수 startQuiz 가 실행되도록 포인터 연결

     

    onPressed: startQuiz, // anonymous function
    

       - 순서 4.  다시 quiz.dart로 이동하면, 해당 부분이 에러남 (추가적으로, 아래 4번에서 추가 방법 설명 예정)

         : 원인: switchScreen값이 초기화 되기전에 사용되기 떄문.

         : 해결: void initState(){} 를 선언하여, build()가 실행되전에, 변수 할당

    Widget activeScreen = StartScreen(switchScreen)

     

    class _QuizState extends State<Quiz> {
      Widget? activeScreen; // able to store widgets in var
      // error because using switchScreen when initializing the activeScreen variable at the same point of time.
    
      @override
      void initState() {
        // initState will execute once after the object has been created
        // this does not excute at all at this time, so no need to use setState
        activeScreen = StartScreen(switchScreen);
        super.initState();
      }
    

     

     

    3.Life-cycle in Flutter Widget.

       - Every Flutter Widget has a built-in lifecycle: A collection of methods that are automatically executed by Flutter

       - 3 가지 중요 Life-Cycle 이 있음

         : 1. initState() : 처음 StatefulWidget's State가 init 될 때, 실행

         : 2. build(): 처음 빌드 된 경우 실행되고, setState가 실행된 후 실행

         : 3. dispose(): Widget 이 버려진 후 실행

     

    4.  2-4 변경

       - 기존의 방법을 ternary expression 으로 변경 할 수 있다. 

    // 방법 1.
    // Widget? activeScreen; // able to store widgets in var
    // error because using switchScreen when initializing the activeScreen variable at the same point of time.
    
    // @override
    // void initState() {
    //   // initState will execute once after the object has been created
    //   // this does not excute at all at this time, so no need to use setState
    //   activeScreen = StartScreen(switchScreen);
    //   super.initState();
    // }
    
    // void switchScreen() {
    //   setState(() {
    //     //QuestionScreen should follow StartScreen();
    //     activeScreen = const QuestionScreen();
    //   });
    // }
    
    // 방법 2.
    var activeScreen = 'start-screen';
    
    void switchScreen() {
      setState(() {
        //QuestionScreen should follow StartScreen();
        activeScreen = 'questions-screen';
      });
    }

       - 기존 activeScreen 에서 아래처럼 변경 

    // 방법 1
    // child: activeScreen,
    // 방법 2: ternary expression
    child: activeScreen == 'start-screen'
        ? StartScreen(switchScreen)
        : const QuestionScreen(),

     

    '> Frontend > Flutter' 카테고리의 다른 글

    Flutter_06. QuizApp03_ Passing Data  (0) 2023.04.24
    Flutter_05. If-Statement & 퀴즈 데이터  (0) 2023.04.22
    Flutter_03. Excercise  (0) 2023.04.18
    Flutter_20230414_02. StatefulWidget  (0) 2023.04.17
    Flutter_20230414_01. Flutter  (0) 2023.04.14

    댓글

Designed by Tistory.