最小可重复代码:
final fooProvider = StateProvider<int>((ref) => 0);
final barProvider = Provider<String>((ref) {
ref.watch(fooProvider); // 1
return '';
});
class FooPage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
body: BarPage(),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(fooProvider.notifier).state++, // 2
),
);
}
}
class BarPage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
print('build(BarPage)'); // 3
final string = ref.watch(barProvider); // 4
return Text(string);
}
}
1:barProvider
正在观看fooProvider
。
2:我正在更改fooProvider
状态。
4:我正在观看barProvider
(它本身正在观看fooProvider
,请参见1(
3:这本应该打印出来,但没有打印出来。
提供商返回的值始终是''
因此,Provider
检测到暴露的值没有更改,并且不通知侦听器。
如果您在barProvider
中放置一个打印,您会看到提供程序已重建。
根据雷米·罗塞莱特的回答,
尝试创建一个";包装器";对于字符串,如下所示:
class Wrapper{
final String value;
Wrapper(this.value);
}
final fooProvider = StateProvider<int>((ref) => 0);
final barProvider = Provider<Wrapper>((ref) {
ref.watch(fooProvider); // 1
return Wrapper('');
});
class FooPage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
return Scaffold(
body: BarPage(),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(fooProvider.notifier).state++, // 2
),
);
}
}
class BarPage extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
print('build(BarPage)'); // 3
final string = ref.watch(barProvider); // 4
return Text(string.value);
}
}