由于initState方法在这里不可覆盖,因此在ConsumerWidget内部初始化事物的解决方案是什么?
答案 0 :(得分:1)
由于我尚未使用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)可以帮助您。另外,请查看examples from the developer关于Riverpod钩子用法。
答案 1 :(得分:0)
您必须使用StatefulWidget
并从build
方法返回Consumer作为根窗口小部件。
消费者
消费者可以用来监听StatefulWidget或 在提供程序更新时重建尽可能少的小部件。
final helloWorldProvider = Provider((_) => 'Hello world');
class RiverpodExample extends StatefulWidget {
@override
_RiverpodExampleState createState() => _RiverpodExampleState();
}
class _RiverpodExampleState extends State<Example> {
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return Consumer(
builder: (context, watch, child) {
final value = watch(helloWorldProvider);
return Text(value); // Hello world
},
);
}
}
答案 2 :(得分:0)