由于 initState 方法在这里不可重写,所以在 ConsumerWidget 内部初始化事物的解决方案是什么?
Riverpod v2.5.1
您可以使用 ConsumerStatefulWidget 和 ConsumerState
final helloWorldProvider = Provider((_) => 'Hello world');
class RiverpodExample extends ConsumerStatefulWidget {
const RiverpodExample({super.key});
@override
ConsumerState<RiverpodExample> createState() => _RiverpodExampleState();
}
class _RiverpodExampleState extends ConsumerState<RiverpodExample> {
@override
void initState() {
super.initState();
final value = ref.read(helloWorldProvider);
print(value); // Hello world
}
@override
Widget build(BuildContext context) {
final value = ref.watch(helloWorldProvider);
return Text(value); // Hello world
}
}
我不完全确定如何回答你的问题,因为我没有使用过 ConsumerWidget。我认为这个想法是将你的大部分状态保留在提供者中。
但是,我建议将 hooks_riverpod 与 flutter_hooks 一起使用(相同的 developer)。
这使得保持小部件本地状态变得简单,并且还可以轻松访问提供程序。
例如:
class Example extends HookWidget {
const Example({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
final test = useProvider(Test.provider());
final controller = useTextEditingController();
final loading = useState(false);
final buttonText = useState('Change me!');
return Column(
children: [
TextField(controller: controller),
if (!loading) RaisedButton(
onPressed: () async {
loading.value = true;
await Future.delayed(const Duration(seconds: 1));
buttonText.value = controller.text;
loading.value = false;
}
child: Text(buttonText.value),
),
if (loading) const CircularProgressIndicator(),
// Do something with providers, etc.
],
),
);
}
只是一个简单的示例,但有大量资源(flutter_hooks、hooks_riverpod)可以帮助您。另外,请查看来自开发人员的示例有关 RiverPod 挂钩使用的信息。