首页 > 解决方案 > 收到用户输入后,我的 setState 不刷新。我正在尝试建立一个聊天页面

问题描述

`final myController = TextEditingController();
@override
void dispose() {
  myController.dispose();
}`

这将为文本输入创建一个控制器

`Widget textField(String hint, TextInputType type) {
  return Padding(
    padding: const EdgeInsets.all(8.0),
    child: CupertinoTextField(
      minLines: 1,
      maxLines: null,
      controller: myController,
      textCapitalization: TextCapitalization.sentences,
      placeholder: hint,
      placeholderStyle: TextStyle(color: hintcolor),
      keyboardType: type,
      style: TextStyle(color: secondarycolor),
    ),
  );
}`

这将使用控制器创建文本字段

`Expanded(child: textField('Type a message', TextInputType.multiline)),
          IconButton(
              icon: Icon(
                Icons.send,
                color: profilesecondarycolor,
              ),
              onPressed: () {
                messagesTo.add(myController.text);
                Future.delayed(Duration(seconds: 1), () {
                  return setState(() {
                    messages = messagesTo.map((content) {
                      Card(child: Text(content));
                    }).toList();
                  });
                });
              })`

这是应该将文本添加到列表的按钮

`body: ListView(children: messagesTo == null ? chats : messages),`

这应该显示列表

`List<Widget> messages;
List<String> messagesTo;
List<Widget> chats = [Text('Welcome')];`

定义条款

它只是显示欢迎,当我单击按钮时,没有任何反应......请帮助

标签: flutterdartsetstate

解决方案


您可以在下面复制粘贴运行完整代码
您的代码的某些部分需要更改,您可以查看完整代码以获取详细信息

代码片段

List<Widget> messages = [];
List<String> messagesTo = [];
Widget chats = Text('Welcome');

onPressed: () {
                  messagesTo.add(myController.text);

                  Future.delayed(Duration(seconds: 1), () {
                    setState(() {
                      messages = [];
                      messagesTo.forEach((content) =>
                          messages.add(Card(child: Text(content))));
                    });
                  });
                }
...
messages.length == 0
                    ? chats
                    : Container(
                        height: 200,
                        child: ListView(shrinkWrap: true, children: messages)),

工作演示

在此处输入图像描述

完整代码

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final myController = TextEditingController();
  List<Widget> messages = [];
  List<String> messagesTo = [];
  Widget chats = Text('Welcome');

  Widget textField(String hint, TextInputType type) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: CupertinoTextField(
        minLines: 1,
        maxLines: null,
        controller: myController,
        textCapitalization: TextCapitalization.sentences,
        placeholder: hint,
        placeholderStyle: TextStyle(color: Colors.blue),
        keyboardType: type,
        style: TextStyle(color: Colors.red),
      ),
    );
  }

  @override
  void dispose() {
    myController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: true,
      //resizeToAvoidBottomPadding: true,
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            messages.length == 0
                ? chats
                : Container(
                    height: 200,
                    child: ListView(shrinkWrap: true, children: messages)),
            Container(
                height: 50,
                child: textField('Type a message', TextInputType.multiline)),
            IconButton(
                icon: Icon(
                  Icons.send,
                  color: Colors.yellow,
                ),
                onPressed: () {
                  messagesTo.add(myController.text);

                  Future.delayed(Duration(seconds: 1), () {
                    setState(() {
                      messages = [];
                      messagesTo.forEach((content) =>
                          messages.add(Card(child: Text(content))));
                    });
                  });
                }),
          ],
        ),
      ),
    );
  }
}

推荐阅读