我是Riverpod的新手,我正在尝试从提供者那里迁移一个应用程序。如果我有一个TextField
,并且希望根据我的提供者模型来设置它的值,我会这样做:
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)
的更改,并相应地更新控制器。
我正试图与提供商实现同样的目标,但我永远无法让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
属性?
发布于 2022-08-26 05:20:29
来自Riverpod官方网站
/1.创建一个StateNotifier子类,StateNotifier是一种可以定义可以改变状态的函数,就像这种状态下的字符串类型一样,您也可以使用对象(类而不是原始类型)
class Counter extends StateNotifier<String> {
Counter() : super('');
void changeText(String text){
state=text;
}
/2.创建一个提供程序StateNotifierProvider,您可以在您的小部件中使用它
final counterProvider = StateNotifierProvider<Counter, String>((ref) {
return Counter();
});
/3.假设提供者--这是我们如何在小部件中附加状态的方法
class Home extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final text = ref.watch(counterProvider);
return Text('$text');
}
}
因此,您可以在这里添加小部件类按钮,onTap执行以下代码
onTap()=>changeText(textController.text);
因此,您的文本Text('$text');将自动更改。
发布于 2022-08-26 03:58:02
String inputText = controller.text;
https://stackoverflow.com/questions/73495714
复制相似问题