问题描述
我将如何维护在整个应用程序中代表相同信息的许多单独材质开关的状态?我在下面粗略地展示了我的页面及其小部件。
帐户页面:我有一个包含 10 个字段的表单,其中有 10 个并发开关,用于显示/隐藏字段中提交的信息。
主页:我有一张可扩展的个人卡片,它有 10 个开关,用于快速显示/隐藏表单中的相同信息。
我发现的任何示例似乎只是演示了管理单个小部件的状态。我研究了 Riverpod 并且喜欢它是“全局的”并且与小部件树分开的想法,对我来说这听起来像是最可行的选择。但是没有使用过 Riverpod,我对如何在我的案例中实现它有点困惑。
解决方法
您可以创建 StateNotifier/ChangeNotifier 来维护状态,然后将所有开关包装在 Consumer 小部件中。
以下是 ChangeNotifier 的示例: 您可以使用像数组这样的原始类型,也可以使用映射来存储开关的状态。
class SwitchesNotifier extends ChangeNotifier {
final switchesStateMap = <String,bool>{};
void changeSwitchState(String switchKey,bool value) {
if (switchesStateMap.containsKey(switchKey)) {
switchesStateMap[switchKey] = value;
} else {
switchesStateMap[switchKey] = true;
}
notifyListeners();
}
}
final switchesNotifierProvider = ChangeNotifierProvider((ref) => SwitchesNotifier());
然后您可以将所有开关包装在消费者小部件中,并根据您的键读取开关值并监听状态变化。另外不要忘记在 switch 小部件的 onChanged 回调中调用 changeSwitchState()。
Consumer(
builder: (_,ScopedReader watch,__) {
final switchNotifier = watch(switchesNotifierProvider);
final switchValue = switchNotifier.switchesStateMap['subtitles']
?? false;
return Switch(
value: switchValue,onChanged: (value) {
context.read(switchesNotifierProvider).changeSwitchState('subtitles',value);
}
);
},),