Flutter:需要一些帮助来处理父 Widget 中多个有状态 Widget 的方法,并具有一定程度的全局可访问性

Flutter: Need some help on approach for multiple Stateful Widgets in parent Widget with some degree of global accessibility

我将如何维护代表整个应用程序相同信息的许多单独材质开关的状态?下面是我的页面及其小部件的粗略表示。

帐户页面:我有一个包含 10 个字段的表单,其中有 10 个并发开关用于 displaying/hiding 在字段中提交的信息。

主页:我有一张可扩展的个人卡,它有 10 个开关,用于快速 display/hide 表格中的相同信息。

我发现的任何示例似乎都只是演示管理单个小部件的状态。我研究过 Riverpod 并喜欢将其 'global' 并与小部件树分开的想法,对我来说这听起来是最可行的选择。但没有使用过 Riverpod,我对如何在我的案例中实现它有点困惑。

您可以创建 StateNotifier/ChangeNotifier 来维护状态,然后将所有开关包装在消费者小部件中。

这是 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());

然后您可以将所有开关包装在消费者小部件中,并根据您的键读取开关值并监听状态变化。也不要忘记在开关小部件的 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);
          }
        );
      },
    ),