flutter 使用Riverpod更新文本编辑控制器文本

idv4meu8  于 2023-03-03  发布在  Flutter
关注(0)|答案(3)|浏览(196)

我是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),
      ]
  }
}

如何更新TextEditingControllertext属性?

xdyibdwo

xdyibdwo1#

来自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.使用Provider这就是我们如何将状态附加到小部件的方法

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');]**将自动更改。

kiz8lqtg

kiz8lqtg2#

最初,我第一次尝试,我得到这个错误:生成错误期间调用了setState()或NeedmarksBuild()。
过了一段时间,我找到了一种方法来做你正在寻找的如下,它有点不那么直观。

class _DirectorySelectState extends ConsumerState<DirectorySelect> {
final directoryTextFieldController = TextEditingController();

@override
void dispose() {
    directoryTextFieldController.dispose();
    super.dispose();
}

@override
Widget build(BuildContext context) {

    ref.listen(selectedDirectoryProvider, (previous, next) {
        setState(() {
            SelectedDirectoryState selectedDirs = next;
            directoryTextFieldController.value = TextEditingValue(text: selectedDirs.directory);
        });
    });

    return Row(children: [
        Text(widget.label),
        const SizedBox(
            width: 10,
        ),
        Expanded(
            child: TextFormField(
                controller: directoryTextFieldController,
x8diyxa7

x8diyxa73#

String inputText = controller.text;

相关问题