TextEditingController 在 .clear() 之后没有清除文本

问题描述 投票:0回答:2

所以我试图在发送消息后清除文本表单,如果消息为空,则应禁用发送按钮,我所拥有的是按钮的 onPressed 永远不会为空,它永远不会被禁用,并且文本被清除但是如果我再次发送,它会在清除之前发送之前的文本(如果这有意义) 因此,如果我发送“Hello”,它显示为空,但按钮仍然处于活动状态,如果我再次重新发送而不输入任何内容,它会发送相同的清除文本,知道我可能做错了什么吗?

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class NewMessage extends StatefulWidget {
  @override
  _NewMessageState createState() => _NewMessageState();
}

class _NewMessageState extends State<NewMessage> {
  final _controller = TextEditingController();
  String _enteredMessage = '';

  void _sendMessage() async {
    setState(() {
      _controller.clear();
    });
    FocusScope.of(context).unfocus();
    final user = FirebaseAuth.instance.currentUser;
    final userData = await FirebaseFirestore.instance
        .collection('users')
        .doc(user.uid)
        .get();

    FirebaseFirestore.instance.collection('chat').add({
      'text': _enteredMessage,
      'createdAt': Timestamp.now(),
      'userId': user.uid,
      'username': userData['username'],
    });
  }

  void sayHello() {
    print('hello');
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(top: 8),
      padding: EdgeInsets.all(8),
      child: Row(
        children: [
          Expanded(
            child: TextField(
              controller: _controller,
              decoration: InputDecoration(labelText: 'Send a message...'),
              onChanged: (value) {
                setState(() {
                  _enteredMessage = value;
                });
              },
            ),
          ),
          IconButton(
            icon: Icon(Icons.send, color: Theme.of(context).primaryColor),
            onPressed: _enteredMessage.trim().isEmpty ? null : _sendMessage,
          )
        ],
      ),
    );
  }
}
firebase flutter dart
2个回答
4
投票

问题

出现错误的原因是您将输入存储在

enteredText
变量中,但正在清除控制器的文本,两者是不同的。这就是为什么您的
enteredText
在清除后仍然保留并发送相同的字符串。

解决方案

如果您提供了控制器,则不必使用单独的变量来保存输入文本。控制器已经保存了输入的值。进行以下更改:

IconButton(
  ...,
  onPressed: (){
    _controller.text = _controller.text.trim();
    if(_controller.text.isNotEmpty) {
      _sendMessage();
    }
  }
)

使用 _controller 中的文本和

_controller.text

void _sendMessage() async {
    FocusScope.of(context).unfocus();
    final user = FirebaseAuth.instance.currentUser;
    final userData = await FirebaseFirestore.instance
        .collection('users')
        .doc(user.uid)
        .get();

    FirebaseFirestore.instance.collection('chat').add({
      'text': _controller.text, //<-- Update here
      'createdAt': Timestamp.now(),
      'userId': user.uid,
      'username': userData['username'],
    });

    setState(() { //<-- Clear at the end
      _controller.clear();
    });
}

终于

您现在可以摆脱

enteredText
变量和
onChange
回调。


0
投票

我面临同样的问题,尝试在清除之前添加延迟

Future.delayed(const Duration(milliseconds: 150)).then((_) {
  _myTextController.clear();
});
© www.soinside.com 2019 - 2024. All rights reserved.