728x90
설명
- StateNotifierProvider는 이전에 배운 StateProvider에 비해 복잡한 상태를 관리할 수 있음
- 다만 프로바이더로 한 번 감싸서 만들어줘야 함
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_theory/model/shopping_item_model.dart';
final shoppingListNotifierProvider =
StateNotifierProvider<ShoppingListNotifier, List<ShoppingItemModel>>(
(ref) => ShoppingListNotifier(),
);
class ShoppingListNotifier extends StateNotifier<List<ShoppingItemModel>> {
ShoppingListNotifier()
: super(
[
ShoppingItemModel(
name: '김치',
quantity: 3,
hasBought: false,
isSpicy: true,
),
ShoppingItemModel(
name: '라면',
quantity: 5,
hasBought: false,
isSpicy: true,
),
ShoppingItemModel(
name: '불닭소스',
quantity: 1,
hasBought: false,
isSpicy: true,
),
ShoppingItemModel(
name: '삼겹살',
quantity: 10,
hasBought: false,
isSpicy: false,
),
ShoppingItemModel(
name: '수박',
quantity: 2,
hasBought: false,
isSpicy: false,
),
ShoppingItemModel(
name: '카스테라',
quantity: 5,
hasBought: false,
isSpicy: false,
),
],
);
void toggleTodo({required String name}) {
state = state
.map(
(e) => e.name == name ? e.copyWith(hasBought: !e.hasBought) : e,
)
.toList();
}
}
- 초기값을 만들고, Provider를 위에서 만들어 줌. Provider의 제너릭은 Notifer와 State가 들어감
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_theory/layout/default_layout.dart';
import 'package:riverpod_theory/model/shopping_item_model.dart';
import 'package:riverpod_theory/riverpod/state_notifier_provider.dart';
class StateNotifierProviderScreen extends ConsumerWidget {
const StateNotifierProviderScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, WidgetRef ref) {
List<ShoppingItemModel> items = ref.watch(shoppingListNotifierProvider);
return DefaultLayout(
title: 'StateNotifierProvider',
body: ListView(
children: items
.map(
(e) => CheckboxListTile(
value: e.hasBought,
title: Text('${e.name}(${e.quantity})'),
onChanged: (value) {
ref.read(shoppingListNotifierProvider.notifier).toggleTodo(
name: e.name,
);
},
),
)
.toList(),
),
);
}
}
- 화면 영역에서 그대로 사용하는 것을 볼 수 있음.
300x250
'flutter > Rivderpod' 카테고리의 다른 글
[Flutter - Riverpod] StateProvider (0) | 2023.02.25 |
---|