我是Riverpod的新手,正在尝试将应用从Provider迁移过来。如果我有一个TextField
,想根据我的Provider模型设置它的值,我会这样做:
class MyWidget extends StatefulWidget{
const MyWidget({ Key? key }) : super(key: key);
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
var controller = TextEditingController();
@override
void didChangeDependencies() {
super.didChangeDependencies();
//Set the value here...
var model = Provider.of<Model>(context);
controller.text = model.name;
}
Widget build(BuildContext context) {
return TextField(controller: controller)
}
}
据我所知,didChangeDependencies()
将侦听来自Provider.of<Model>(context)
的更改,并相应地更新我的控制器。
我试图用Provider完成同样的事情,但是我从来没有显示过TextField
的值。
class MyWidget extends ConsumerStatefulWidget {
const MyWidget({Key? key}) : super(key: key);
@override
ConsumerState<ConsumerStatefulWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends ConsumerState<MyWidget> {
var controller = TextEditingController();
@override
void didChangeDependencies() {
super.didChangeDependencies();
//Trying the same thing here...
final name = ref.watch(providerName);
controller.text = name;
}
Widget build(BuildContext context) {
final name = ref.watch(providerName);
return Column(
children: [
//This doesn't work:
TextField(controller: controller),
//I know my provider has the value, because this works fine:
Text(name),
]
}
}
如何更新TextEditingController
的text
属性?
3条答案
按热度按时间xdyibdwo1#
来自Riverpod官网
///1.创建一个[StateNotifier]子类,StateNotifier是一个你可以定义函数来改变你的状态的东西,就像在这个状态中是字符串类型,你也可以使用对象(类而不是原语类型)
///2.创建一个提供程序[StateNotifierProvider],您可以在小部件中使用它
///3.使用Provider这就是我们如何将状态附加到小部件的方法
因此,您可以在此处添加按钮等小部件,onTap执行如下代码
因此,您的文本**[文本('$text');]**将自动更改。
kiz8lqtg2#
最初,我第一次尝试,我得到这个错误:生成错误期间调用了setState()或NeedmarksBuild()。
过了一段时间,我找到了一种方法来做你正在寻找的如下,它有点不那么直观。
x8diyxa73#