簡體   English   中英

StateNotifierProvider:是否可以使用單個 StateNotifierProvider 控制表單中不同小部件的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM