Flutter

[Flutter] 42. Provider 라이브러리

Song hyun 2024. 11. 13. 11:20
728x90
반응형

[Flutter] 42. Provider 라이브러리 

 

1. Provider 라이브러리 설치하기

https://pub.dev/packages/provider

 

provider | Flutter package

A wrapper around InheritedWidget to make them easier to use and more reusable.

pub.dev

 

 

provider: ^6.1.2

 

 


 

2. 리팩토링

(1) View - todo_screen.dart

import 'package:flutter/material.dart';
import 'package:mvvm_project_v01/start_04/view_models/todo_view_model.dart';
import 'package:provider/provider.dart';

// MaterialApp 앱 안에서 외부 라이브러리(프로바이더) 위젯을 감싸 주어야 한다.
void main() => runApp(
  MaterialApp(
    //  (_) => TodoViewModel() -> 매개 변수를 사용안할 꺼면 _ 를 선언한다.
    home: ChangeNotifierProvider(
      create: (_) => TodoViewModel(),
      builder: (context, child) {
        return TodoScreen();
      },
    ),
  ),
);

class TodoScreen extends StatelessWidget {
  TodoScreen({super.key});

  final TextEditingController _controller = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MVVM provider Todo List'),
      ),
      body: Column(
        children: [
          // 입력 필드 만들기
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _controller,
                    decoration: InputDecoration(labelText: '작업을 입력 하시오'),
                  ),
                ),
                IconButton(
                  onPressed: () {
                    // 여기에서 뷰 모델 클래스를 가져오자 --> DI 처리
                    final todoViewModel =
                    Provider.of<TodoViewModel>(context, listen: false);
                    if (_controller.text.isNotEmpty) {
                      todoViewModel.addTodo(_controller.text);
                      _controller.clear();
                    }
                  },
                  icon: Icon(Icons.add),
                )
              ],
            ),
          ),
          // 아래에 할일 목록 표시 구성
          Expanded(
            child: Consumer<TodoViewModel>(
              builder: (context, todoViewModel, child) {
                return ListView.builder(
                  itemCount: todoViewModel.todos.length,
                  itemBuilder: (context, index) {
                    // 뷰모델에 있는 자료구조 안에 각 인덱스에 맵핑된 객체 Todo인스턴스 하나
                    final todo = todoViewModel.todos[index];
                    return ListTile(
                      title: Text(todo.title),
                      trailing: IconButton(
                        icon: Icon(Icons.delete),
                        onPressed: () => todoViewModel.removeTodo(todo.id),
                      ),
                    );
                  },
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

 

 

  • Provider-Stateless도 괜찮은 이유: 상태 관리를 View model에서 관리하기 떄문이다.
728x90
반응형