我正在尝试 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 个单独的提供程序吗?预先感谢您的帮助!
这就是家庭通知者/提供者的用途。共享由系列密钥区分的通用代码的多个提供商。请参阅文档https://riverpod.dev/docs/essentials/passing_args