gpt4 book ai didi

Flutter Riverpod - 在构建方法中使用 read()

转载 作者:行者123 更新时间:2023-12-05 00:55:29 25 4
gpt4 key购买 nike

假设我想通过使用 TextFormField 上的 initialValue: 属性来初始化文本字段,并且我需要来自提供者的初始值。我在 docs 上阅读从 build 方法内部调用 read() 被认为是不好的做法,但从处理程序调用很好(如 onPressed)。所以我想知道从 initialValue 属性调用读取是否可以,如下所示?

enter image description here

最佳答案

不,如果您使用钩子(Hook),则应使用 useProvider,如果不使用,则应使用 ConsumerWidget/Consumer

不同之处在于,initialValue 字段是构建方法的一部分,就像你说的,onPressed 是构建方法之外的处理程序。

提供者的一个核心方面是在提供的值发生变化时优化重建。在构建方法中使用 context.read 会抵消这种好处,因为您没有听到提供的值。

强烈建议在匿名函数中使用 context.read(onChangedonPressedonTap 等。 ) 因为这些函数在执行函数时正在检索提供的值。这意味着该函数将始终使用该提供者的当前值执行,而无需监听该提供者。读取提供程序的其他方法使用监听器,这在匿名函数的情况下更昂贵且不必要。

在您的示例中,您想设置 TextFormFieldinitialValue。以下是如何使用 hooks_riverpodflutter_hooks来实现这一点。

class HooksExample extends HookWidget {
const HooksExample({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return TextFormField(
initialValue: useProvider(loginStateProv).email,
);
}
}

对于不喜欢使用钩子(Hook)的读者:

class ConsumerWidgetExample extends ConsumerWidget {
const ConsumerWidgetExample({Key key}) : super(key: key);

@override
Widget build(BuildContext context, ScopedReader watch) {
return TextFormField(
initialValue: watch(loginStateProv).email,
);
}
}

或者:

class ConsumerExample extends StatelessWidget {
const ConsumerExample({Key key}) : super(key: key);

@override
Widget build(BuildContext context) {
return Consumer(
builder: (context, watch, child) {
return TextFormField(
initialValue: watch(loginStateProv).email,
);
},
);
}
}

主要区别在于 Consumer 只会重建其子代,因为只有它们依赖于提供的数据。

关于Flutter Riverpod - 在构建方法中使用 read(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64253162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com