首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Riverpod更新TextEditingController文本

用Riverpod更新TextEditingController文本
EN

Stack Overflow用户
提问于 2022-08-26 03:14:58
回答 2查看 113关注 0票数 0

我是Riverpod的新手,我正在尝试从提供者那里迁移一个应用程序。如果我有一个TextField,并且希望根据我的提供者模型来设置它的值,我会这样做:

代码语言:javascript
运行
复制
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的价值显现出来。

代码语言:javascript
运行
复制
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),
      ]
  }
}

如何更新我的TextEditingControllertext属性?

EN

回答 2

Stack Overflow用户

发布于 2022-08-26 05:20:29

来自Riverpod官方网站

/1.创建一个StateNotifier子类,StateNotifier是一种可以定义可以改变状态的函数,就像这种状态下的字符串类型一样,您也可以使用对象(类而不是原始类型)

代码语言:javascript
运行
复制
class Counter extends StateNotifier<String> {
      Counter() : super('');
      
      void changeText(String text){
      
      state=text;

      } 

/2.创建一个提供程序StateNotifierProvider,您可以在您的小部件中使用它

代码语言:javascript
运行
复制
final counterProvider = StateNotifierProvider<Counter, String>((ref) {
  return Counter();
});

/3.假设提供者--这是我们如何在小部件中附加状态的方法

代码语言:javascript
运行
复制
class Home extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final text = ref.watch(counterProvider);
    return Text('$text');
  }
}

因此,您可以在这里添加小部件类按钮,onTap执行以下代码

代码语言:javascript
运行
复制
 onTap()=>changeText(textController.text);

因此,您的文本Text('$text');将自动更改。

票数 1
EN

Stack Overflow用户

发布于 2022-08-26 03:58:02

代码语言:javascript
运行
复制
String inputText = controller.text;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73495714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档