Flutter

[Practice] TodoList만들기

모리선생 2023. 3. 29. 07:33
728x90

목표

TodoList를 만들어 기초적인 클래스의 구성과 데이터가 이동하는 방식을 이해한다.


import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

///5. 클래스를 만들어준다. 클래스의 생성자를 만든다는 것은 해당 내용을 받을 수 있는 그릇을 만드는 것이라고 해석하면 된다.
///즉, Textformfield에서 입력받은 글자들을 저장하기 위한 저장 그릇이다.
class Todo {
  final String title;
  final String description;

  Todo({required this.title, required this.description});
}

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

  @override
  State<MyApp> createState() => _MyAppState();
}

///1. todoApp의 상태는 변한다. 그러므로 Statefulwidget을 쓴다.
class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Todo List',

      ///2. debugshow배너를 삭제한다.
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      home: const todoApp(),
    );
  }
}

///3. StatefulWidget을 상속받는 todoApp 클래스를 만든다.
class todoApp extends StatefulWidget {
  const todoApp({super.key});

  @override
  State<todoApp> createState() => _todoAppState();
}

class _todoAppState extends State<todoApp> {
  ///6. 변수를 선언한다. 변수를 선언한다는 것은 앞으로 이 내용을 사용할 것을 미리 알려주는 것이다.
  ///List 형식을 추가함으로써 어떠한 형태로 저장 될 것인지도 알려준다.
  ///빈문자열이 만들어졌다.

  String title = "";
  String description = "";

  List<Todo> todos = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("todolist"),
        actions: [
          IconButton(

              ///4. 할일을 추가할 수 있는 버튼을 만들어보자.
              onPressed: () {
                showDialog(
                    context: context,
                    barrierDismissible: true,
                    builder: (BuildContext ctx) {
                      return AlertDialog(
                        content: Text("Todo"),
                        actions: [
                          TextFormField(
                            ///7. 변화를 감지할 수 있는 onchanged를 사용한다
                            ///상태를 변화하여 UI에 표현하기 위한 것이 setState이다.
                            onChanged: (value) {
                              setState(() {
                                title = value;
                              });
                            },
                            decoration: InputDecoration(hintText: "title"),
                          ),
                          TextFormField(
                            onChanged: (value) {
                              setState(() {
                                description = value;
                              });
                            },
                            decoration: InputDecoration(hintText: "content"),
                          ),
                          Center(
                            child: ElevatedButton(
                                onPressed: () {
                                  ///9. Add버튼 입력 후 팝업창을 없애보자.
                                  Navigator.of(context).pop();

                                  ///7-1. elevatedbutton을 누를 시 todo list에 값을 추가할 수 있도록 한다.
                                  setState(() {
                                    todos.add(Todo(
                                        title: title,
                                        description: description));
                                  });
                                },
                                child: Text("Add")),
                          )
                        ],
                      );
                    });
              },
              icon: Icon(Icons.add))
        ],
      ),

      ///8. 이제 바디 부분을 만들어서 우리가 입력한 값들이 나타날 수 있도록 설정한다.
      ///Inkwell은 제스쳐 기능을 제공하지 않는 위젯을 이 위젯으로 감싸면 onTap()의 기능을 이용할 수 있다.
      body: ListView.builder(
        itemBuilder: (_, index) {
          return InkWell(
            child: ListTile(
              title: Text(todos[index].title),
              subtitle: Text(todos[index].description),
            ),
          );
        },
        itemCount: todos.length,
      ),
    );
  }
}


///참고1. https://velog.io/@hoha/플러터-Todo-App-만들기

실제 구동화면

 

다음에는 각 내용을 삭제할 수 있는 방법을 알아보자.

728x90

'Flutter' 카테고리의 다른 글

[Practice] carousel_slider  (0) 2023.03.31
[플러그인] 사용하기 좋은 플러그인 7가지 소개  (0) 2023.03.30
5-1. Riverpod 실습 (Counter App)  (0) 2023.03.28
9. Optimistic Response  (0) 2023.03.16
8. Swagger  (0) 2023.03.16