Riverpod:在 ConsumerWidget 中重写 initState 的替代方法

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

由于 initState 方法在这里不可重写,所以在 ConsumerWidget 内部初始化事物的解决方案是什么?

flutter dart provider riverpod
3个回答
46
投票

Riverpod v2.5.1

您可以使用 ConsumerStatefulWidgetConsumerState

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

5
投票

我不完全确定如何回答你的问题,因为我没有使用过 ConsumerWidget。我认为这个想法是将你的大部分状态保留在提供者中。

但是,我建议将 hooks_riverpodflutter_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_hookshooks_riverpod)可以帮助您。另外,请查看来自开发人员的示例有关 RiverPod 挂钩使用的信息。


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