[英]StateNotifierProvider: is it possible to control the value of different widgets in a form using a single StateNotifierProvider
class SearchFilterModel {
bool searchByDistance;
bool filterByStatusOpen;
String searchText;
...
}
class SearchFilterModelNotifier extends StateNotifier<SearchFilterModel> {
SearchFilterModelNotifier()
: super(SearchFilterModel(
searchByDistance: true,
filterByStatusOpen: false,
searchText: ''));
void updateSearchByDistance(bool searchByDistance) {
state.searchByDistance = searchByDistance;
}
void updateFilterByStatusOpen(bool filterByStatusOpen) {
state.filterByStatusOpen = filterByStatusOpen;
}
void updateSearchText(String searchText) {
state.searchText = searchText;
}
}
final searchFilterModelNotifierProvider = StateNotifierProvider<SearchFilterModelNotifier, SearchFilterModel>((ref) => SearchFilterModelNotifier());
class SearchForm extends ConsumerWidget {
@override
Widget build(context, watch) {
final searchFilterModelNotifier = watch(searchFilterModelNotifierProvider.notifier);
final searchFilterModel = watch(searchFilterModelNotifierProvider);
return Form(
child: Column(
children: [
SwitchListTile(
value: searchFilterModel.searchByDistance,
onChanged: (bool value) => searchFilterModelNotifier.updateSearchByDistance(value),
title: Text('Search by distance?')),
SwitchListTile(
value: searchFilterModel.filterByStatusOpen,
onChanged: (bool value) => searchFilterModelNotifier.updateFilterByStatusOpen(value),
title: Text('Filter by open status?')),
// not even sure how to do the text one if using a TextFormField
]
)
);
}
}
好的,對於我這樣結構的項目,Switch 的值沒有按預期運行,它們的值根本沒有更新,我相信這只是小部件沒有重建。 我能夠為每個表單字段使用不同的狀態提供程序來完成這項工作,但是當我有很多表單字段時,能夠擁有一個代表整個表單的單個 StateNotifierProvider 會更好。 這只是不可能的事情嗎?
答案是將 StateNotifier 方法更新為類似
void updateSearchByDistance(bool searchByDistance) {
state = SearchFilterModel(... searchByDistance: searchByDistance);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.