Flutter Riverpod,build()在更改状态后不会被调用



最小可重复代码:

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);
}
}

1barProvider正在观看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);
}
}

最新更新