> Frontend/Flutter

Flutter_05. If-Statement & 퀴즈 데이터

Janku 2023. 4. 22. 19:58

1. if 문으로 삼항을 대체.

Widget screenWidget = StartScreen(switchScreen);

if (activeScreen == 'questions-screen') {
  screenWidget = const QuestionScreen();
}

 

2. Quiz Data 추가

questions.dart
0.00MB

Questions Page (questions_screen)에서 사용될 Quiz와 Answer 모음을 첨부

questions.dart 페이지는 아래와 같이 생겼는데,  

const questions = [
  QuizQuestion(
    'What are the main building blocks of Flutter UIs?',
    [
      'Widgets',
      'Components',
      'Blocks',
      'Functions',
    ],
  ),

];

 

여기서, QuizQuestion Class 로 감싸서 나중에 연결할 예정.

class QuizQuestion {
  const QuizQuestion(this.text, this.answers);
  final String text;
  final List<String> answers;
}

3. Quiz Page 변경

   -실제 데이터와 연결하여 사용하기 전에, Quiz Page (questions_screen) 을 구성한다.

import 'package:basic101_01/components/answer_button.dart';
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 SizedBox(
      width: double.infinity, // use as much width you can.
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          const Text(
            'The Question',
            style: TextStyle(color: Colors.white),
          ),
          const SizedBox(
            height: 30,
          ),
          AnswerButton('Answer1', () {
            print('Hello');
          }),
          AnswerButton('Answer2', () {}),
          AnswerButton('Answer3', () {}),
          AnswerButton('Answer4', () {}),
        ],
      ),
    );
  }
}

- width: double.infinity를  사용하여, 사용 가능한 width의 최대 길이 사용.

- child: Column (세로) 형태의 구조를 가질 것이고, 중앙 정렬로, 진행.

- children: Quiz의 질문과 답 버튼 노출

- 여기서, 답 버튼은 컴포넌트로 빼서, 공통 사용할 것이다.

 

4. Answer Button Component로 만들기

import 'package:flutter/material.dart';

class AnswerButton extends StatelessWidget {
  const AnswerButton(this.answerText, this.onTap, {super.key}); //positional argument
  // const AnswerButton({super.key, required this.answerText, required this.onTap}); //required argument

  final String answerText;
  final Function() onTap;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
        onPressed: onTap,
        style: ElevatedButton.styleFrom(
          backgroundColor: const Color.fromARGB(255, 33, 1, 95),
          foregroundColor: Colors.white,
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)),
          padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 30),
        ),
        child: Text(answerText));
  }
}

- shape: 버튼의 형태를 설정 할 수 있다. 

-  Constructor에서 받는 arguments의 경우 아래와 같이 두개로 진행하였으니, 양자택일

const AnswerButton(this.answerText, this.onTap, {super.key}); //positional argument
// or
const AnswerButton({super.key, required this.answerText, required this.onTap}); //required argument