Flutter:需要一些帮助来处理具有某种程度的全局可访问性的父 Widget 中的多个 Stateful Widgets

emTeeDub

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

帐户页面:我有一个包含 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);
          }
        );
      },
    ),

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章