0

questionController.text 总是返回一个空值。而不是我在 textformfield 中插入的任何内容。

class _AddQuestionState extends State<AddQuestion> {

  TextEditingController questionController = TextEditingController();
  
   
  @override
  Widget build(BuildContext context) {
    

    return Scaffold(
      body:  Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextFormField(
              controller: questionController,
              decoration: InputDecoration(
                hintText: 'description',
                hintStyle: TextStyle(
                    color: Colors.grey
                ),
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.all(Radius.circular(20.0)),
                ),
              ),),
             AddUser(questionController.text),]

}}

当我调用这个类并打印输出时,它返回 null。

使用 AddUser(questionController.text);

我使用 print(question) 打印了输出,但它返回了空字符串。

class AddUser extends StatelessWidget {
  final String question;

  
  AddUser(this.question);
  
  @override
  Widget build(BuildContext context) {
    // Create a CollectionReference called users that references the firestore collection
    CollectionReference users = FirebaseFirestore.instance.collection('Questions').doc("cse").collection("CSE");

    Future<void> addUser() {
      print(question);
      // Call the user's CollectionReference to add a new user
      return users
          .add({
        'question': question, // John Doe
        
      })
          .then((value) => print("User Added"))
          .catchError((error) => print("Failed to add user: $error"));
    }
4

1 回答 1

1

发生的情况是,当它第一次构建屏幕时,您的AddQuestion小部件 questionController 被设置为传递给 AddUser() 小部件的空字符串。

如果 [controller] 为 null,则 [TextEditingController] 将自动构造,其文本将初始化为 [initialValue] 或空字符串。

当您更改 questionController 中的值时,您的 AddUser() 小部件不知道更改。通过添加 setState 它将重建整个 AddQuestion 小部件并将新值传递给您的 AddUser 小部件。

试试这个例子有一个不明白

class MyWidget extends StatefulWidget {
  const MyWidget({Key? key}) : super(key: key);

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  TextEditingController questionController = TextEditingController();
  String? questionValue;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          children: [
            TextFormField(
              controller: questionController,
              decoration: InputDecoration(
                hintText: 'description',
                hintStyle: TextStyle(color: Colors.grey),
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.all(Radius.circular(20.0)),
                ),
              ),
            ),
            SizedBox(height: 20),
            TextButton(
              onPressed: () {
                print("questionController: ${questionController.text}");
                setState(() {
                  questionValue = questionController.text;
                });
              },
              child: Text("SETSTATE BUTTON"),
            ),
            SizedBox(height: 20),
            Text("questionValue: $questionValue"),
            SizedBox(height: 20),
            AddUser(questionController.text),
          ],
        ),
      ),
    );
  }
}

class AddUser extends StatelessWidget {
  final String question;

  AddUser(this.question);

  @override
  Widget build(BuildContext context) {
    return Text("question: $question");
  }
}
于 2021-09-22T03:00:01.320 回答