【问题标题】:Error: Expected a value of type 'TextEditingController', but got one of type 'TextEditingValue'错误:需要一个“TextEditingController”类型的值,但得到一个“TextEditingValue”类型的值
【发布时间】:2020-08-19 06:31:41
【问题描述】:

我正在尝试将 ValueListenableBuilder 包裹在具有获取输入文本并返回相同文本的功能的 Textfield 周围。最初的目的是通过数据库持久化输入数据。但是在实现下面给出的基本代码时,我收到错误“期望一个'TextEditingController'类型的值,但得到一个'TextEditingValue'类型的值”。你能告诉我错误吗?

import 'package:flutter/material.dart';

void main() => runApp(MyTextFieldApp());

class MyTextFieldApp extends StatelessWidget {
  final _controller = TextEditingController();
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        backgroundColor: Colors.white,
        body: Container(
          padding: EdgeInsets.all(24.0),
          child: Center(
            child: ValueListenableBuilder(
                valueListenable: _controller,
                builder: (BuildContext context, _controller, _ ) {
                   return TextField(
                     autofocus: true,
                     maxLines: 6,
                     controller: _controller,
                     decoration: InputDecoration(
                      labelText: "Note",
                       border: OutlineInputBorder(
                       borderRadius: BorderRadius.circular(5.0),
                     ),
                    ),
                   );
                },
             ),
          )
        )
      )
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您应该执行以下操作:

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyTextFieldApp());
    
    class MyTextFieldApp extends StatelessWidget {
      final _controller = TextEditingController();
      final ValueNotifier valueNotifier = ValueNotifier("initial");
      
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
              appBar: AppBar( title : Text("Title")),
            backgroundColor: Colors.white,
            body: Container(
              padding: EdgeInsets.all(24.0),
              child: Center(
                child: ValueListenableBuilder(
                    valueListenable: valueNotifier,
                    builder: (BuildContext context, values, child ) {
                     
                       return Column(
                         children : <Widget>[
                         TextField(
                         autofocus: true,
                         maxLines: 6,
                         controller: _controller,
                         decoration: InputDecoration(
                          labelText: "Note",
                           border: OutlineInputBorder(
                           borderRadius: BorderRadius.circular(5.0),
                         ),
                        ),
                       ),
                            RaisedButton(child : Text("click me"),onPressed : (){
                              valueNotifier.value = _controller.text;
                            }),
                           Text(values),
                         ],
                      );
                    },
                 ),
              )
            )
          )
        );
      }
    }
    

    来自文档:

    ValueListenableBuilder&lt;T&gt;

    其内容与 ValueListenable 保持同步的小部件。

    给定一个 ValueListenable 和一个从 T 的具体值构建小部件的构建器,该类将自动将自己注册为 ValueListenable 的侦听器,并在值更改时调用具有更新值的构建器。

    valueListenable属性是ValueListenable&lt;T&gt;类型,是ValueNotifier&lt;T&gt;实现的接口。

    因此需要创建ValueNotifier&lt;T&gt;的实例:

    final ValueNotifier valueNotifier = ValueNotifier("initial");
    

    在这种情况下,我使用类型 String 和初始值 initial 创建了它。然后将此实例分配给属性valueListenable

     valueListenable: valueNotifier,
    

    builder 类型为 ValueWidgetBuilder&lt;T&gt; 只会在 valueNotifier 更新时被调用。

    因此您可以创建RaisedButtononPressed,您可以更新valueNotifier 值,这将调用builder 并更新Text 小部件。

    https://api.flutter.dev/flutter/widgets/ValueListenableBuilder-class.html

    【讨论】:

      【解决方案2】:

      您没有将 TextEditingController 传递给 TextField

      ValueListenableBuilder(
                      valueListenable: _controller,
                      builder: (BuildContext context, _controller, _ ) {
      // this _controller is not equal to the valueListenable: _controller above, it means _controller.value
                         return TextField(
                           autofocus: true,
                           maxLines: 6,
                           controller: _controller,
                           decoration: InputDecoration(
                            labelText: "Note",
                             border: OutlineInputBorder(
                             borderRadius: BorderRadius.circular(5.0),
                           ),
                          ),
                         );
                      },
                   ),
      
      ValueListenableBuilder(
                      valueListenable: _controller,
                      builder: (BuildContext context, _value, _ ) {
                         return TextField(
                           autofocus: true,
                           maxLines: 6,
                           controller: _controller,// assign the TextEditingController
                           decoration: InputDecoration(
                            labelText: "Note",
                             border: OutlineInputBorder(
                             borderRadius: BorderRadius.circular(5.0),
                           ),
                          ),
                         );
                      },
                   ),
      

      【讨论】:

        猜你喜欢
        • 2021-10-23
        • 2022-01-08
        • 2021-12-17
        • 2021-09-13
        • 2021-12-31
        • 2021-12-04
        • 2021-09-18
        • 2021-06-06
        • 2021-07-13
        相关资源
        最近更新 更多