Riverpod Notifer 适用于同一类型的多个小部件

问题描述 投票:0回答:1

我正在尝试 Riverpod,但我很难理解其中的一些内容。在 BloC 中,当你用 Bloc 包装一个小部件并映射出一个小部件列表时,你会得到 5 个 Bloc 实例,但似乎与 Riverpod 不同,你只得到一个,当你更改一个值时,它会发生变化对于所有元素。示例:

通知者:

import 'package:flutter_riverpod/flutter_riverpod.dart';

class BasicBoolNotifier extends Notifier<SomeData> {
  @override
  SomeData build() {
    return SomeData();
  }

  //update values onPressButton
  void updateValue(String element, bool value) {
    if (element == "Text1") {
      state = state.copyWith(value1: value);
    } else if (element == "Text2") {
      state = state.copyWith(value2: value);
    } else if (element == "Text3") {
      state = state.copyWith(value3: value);
    }
  }


  //read the current state of the element so i know the bool value for that element
  bool getValue(String element) {
    if (element == "Text1") {
      return state.value1;
    } else if (element == "Text2") {
       return state.value2;
    }else if (element == "Text3") {
       return state.value3;
    }
    return false;
  }
}

final boolNotifierProvider =
    NotifierProvider<BasicBoolNotifier, SomeData>(BasicBoolNotifier.new);

class SomeData{
  final bool value1;
  final bool value2;
  final bool value3;

  SomeData({
    this.value1 = false,
    this.value2 = false,
    this.value3 = false,
  });

  SomeData copyWith({
    bool? value1,
    bool? value2,
    bool? value3,
  }) {
    return SomeData(
      value1: value1 ?? this.value1,
      value2: value2 ?? this.value2,
      value3: value3 ?? this.value3,
    );
  }
}

屏幕和按钮按下:

// the class extends ConsumerWidget
final notifier = ref.watch(boolNotifierProvider.notifier);

Column(
  children: [
    'Text1',
    'Text2',
    'Text3',
  ].map((e) {
    final bool value = notifier.getValue(e);
    return Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Text(e),
          InkWell(
            onTap: () {
              notifier.updateValue(e, !value);
            
            },
          ),
      //based on the condition of the element value, return text
          value ? Text('On') : Text('Off'),
         ],
       );

我有什么遗漏的吗?我只想更改列表中一个元素的值,而不是所有元素的值...可以在 Riverpod 中使用一个提供程序来完成此操作,而不是为 3 个单独的值创建 3 个单独的提供程序吗?预先感谢您的帮助!

flutter mobile riverpod
1个回答
0
投票

这就是家庭通知者/提供者的用途。共享由系列密钥区分的通用代码的多个提供商。请参阅文档https://riverpod.dev/docs/essentials/passing_args

© www.soinside.com 2019 - 2024. All rights reserved.