【问题标题】:Flutter pass a function to TextEditingController(text)Flutter 将函数传递给 TextEditingController(text)
【发布时间】:2021-02-10 23:44:42
【问题描述】:

我有这个功能

String test() => 'test'; 

我想将它传递给TextEditingController 的文本参数,就像这个一样。

final TextEditingController _form1 = TextEditingController(text: test() );

但我收到此错误消息。

"The instance member 'Test' can't be accessed in an initializer.
 Try replacing the reference to the instance member with a different expression"

我该如何解决?另外,为什么会这样?谢谢!

更新


我将函数移到类级别并且它可以工作。至少有这个例子。

String test() => 'test';

class SecondScreen extends StatefulWidget {
  @override
  _SecondScreenState createState() => _SecondScreenState();
}


class _SecondScreenState extends State<SecondScreen> {
  Future _signOut() async {
    await FirebaseAuth.instance.signOut();
  }
  final TextEditingController _form1 = TextEditingController(text: test() );
  ...

该示例完美运行。问题是我的 let's 调用 test() 函数,不是返回一个字符串那么简单,而是这个。

 String uid2str(String uid) {
    FirebaseFirestore.instance
        .collection('Usuarios')
        .doc(uid)
        .get()
        .then((DocumentSnapshot documentSnapshot) {
      if (documentSnapshot.exists) {
        Map<String, dynamic> data = documentSnapshot.data()['InfoUser'];
        return '${data['Nombre']} ${data['Apellido']}';
      } else {
        return 'undefined';
      }
    });
  }
final TextEditingController _form1 = TextEditingController(text: uid2str(userID) );

对于这种情况,它不起作用,我尝试使用 await/async,但似乎 text 无法获取不是 String 的类型。所以 Future 不能用。

我也不能在我的 TextFieldForm 中使用 initialValue,因为我已经有一个控制器,而且我似乎不能同时拥有它们。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    Science test() 是一个函数,它可以返回动态值。所以它不能在初始化程序中访问。有几种方法可以替换它:

    1. 将此代码添加到您的constructorinitState

      final TextEditingController _form1 = TextEditingController(text: test() );
      
    2. 如果字符串总是相同的,

       final TextEditingController _form1 = TextEditingController(text: 'test' );
      
    3. 使用textFormField 代替textField

       TextFormField(
         //your code
         initialValue = test(),
       )
      
    4. 在您的constructor 中设置测试,

       _form1.text = test();
      

    也许还有其他可能的方法!

    【讨论】:

    • 我尝试将函数移到类级别,我可以调用它。该示例完美运行,问题是,我的真实功能不起作用,我认为这是因为显示文本比我尝试从 Firestore 中的用户获取名称的功能更快。我尝试使用 await/asing 但它无法使用,因为文本正在等待一个字符串而不是未来,我将使用函数更新...
    • 是的,如果在类外部调用它就可以工作,因为它是在 TextEditingController 之前初始化的。当您将它们放在同一个类上时,该函数尚未构建为在 TextEditingController 中调用。所以它会抛出一个错误。不是firestore的问题。
    猜你喜欢
    • 2021-01-02
    • 2021-08-18
    • 1970-01-01
    • 2020-02-02
    • 2020-05-06
    • 2020-07-28
    • 2019-08-19
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多