Flutter SetState不使用listview.builder

Flutter SetState不使用listview.builder,flutter,listview,flutter-layout,setstate,Flutter,Listview,Flutter Layout,Setstate,我这里有一些用于应用程序聊天屏幕的代码。此特定聊天屏幕用于与机器人聊天。机器人应该在用户发送每条消息之后发送一条消息。由bot发送的消息列表存储在messageStrings中。我正在使用listview.builder使用添加到消息列表中的新消息填充UI 我正在使用setstate添加新消息,但UI没有使用新消息进行更新。这是我的代码: import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'

我这里有一些用于应用程序聊天屏幕的代码。此特定聊天屏幕用于与机器人聊天。机器人应该在用户发送每条消息之后发送一条消息。由bot发送的消息列表存储在messageStrings中。我正在使用listview.builder使用添加到消息列表中的新消息填充UI

我正在使用setstate添加新消息,但UI没有使用新消息进行更新。这是我的代码:

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

class ReportPage extends StatefulWidget {
  BuildContext context;
  ReportPage(this.context);
  @override
  _ReportPageState createState() => _ReportPageState();
}

class _ReportPageState extends State<ReportPage> {
  
  @override
  Widget build(Object context) {
    TextEditingController messageContoller = new TextEditingController();

    //The first two messages by the bot are already added to the List
    List<ChatMessage> messages = [
    ChatMessage(messageContent: "Message 1", messageType: "receiver"),
    ChatMessage(messageContent: "Message 2", messageType: "receiver"),
  ];
  int messageIndex = 0;
  //The next messages that are to be added to the list after a response from the user
  List<String> messageStrings = ["Message 3", "Message 4","Message 5",];
    return Scaffold(
      appBar: AppBar(
        title: Row(children: [
          Container(
            width: 35,
            height: 35,
            child: Image.asset(
              'assets/images/police.png',
              fit: BoxFit.cover,
            ),
            decoration:
                BoxDecoration(shape: BoxShape.circle, color: Colors.white),
          ),
          SizedBox(
            width: 10,
          ),
          Text("CFB bot"),
        ]),
      ),
      body: Container(
        padding: EdgeInsets.all(20),
        child: Stack(
          children: <Widget>[
            ListView.builder(
              itemCount: messages.length,
              shrinkWrap: true,
              padding: EdgeInsets.only(top: 10, bottom: 10),
              physics: NeverScrollableScrollPhysics(),
              itemBuilder: (context, index) {
                return Container(
                  padding:
                      EdgeInsets.only(left: 14, right: 14, top: 10, bottom: 10),
                  child: Align(
                    alignment: (messages[index].messageType == "receiver"
                        ? Alignment.topLeft
                        : Alignment.topRight),
                    child: Container(
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(20),
                        color: (messages[index].messageType == "receiver"
                            ? Colors.grey.shade200
                            : Colors.blue[200]),
                      ),
                      padding: EdgeInsets.all(16),
                      child: Text(
                        messages[index].messageContent,
                        style: TextStyle(fontSize: 15),
                      ),
                    ),
                  ),
                );
              },
            ),
            Align(
              alignment: Alignment.bottomLeft,
              child: Container(
                decoration: BoxDecoration(
                    border: Border.all(color: Colors.black),
                    borderRadius: BorderRadius.all(Radius.circular(20))),
                padding: EdgeInsets.only(left: 10, bottom: 10, top: 10),
                height: 60,
                width: double.infinity,
                child: Row(
                  children: <Widget>[
                    GestureDetector(
                      onTap: () {},
                      child: Container(
                        height: 30,
                        width: 30,
                        decoration: BoxDecoration(
                          color: Colors.lightBlue,
                          borderRadius: BorderRadius.circular(30),
                        ),
                        child: Icon(
                          Icons.add,
                          color: Colors.white,
                          size: 20,
                        ),
                      ),
                    ),
                    SizedBox(
                      width: 15,
                    ),
                    Expanded(
                      child: TextField(
                        decoration: InputDecoration(
                            hintText: "Write message...",
                            hintStyle: TextStyle(color: Colors.black54),
                            border: InputBorder.none),
                            controller: messageContoller,
                      ),
                    ),
                    SizedBox(
                      width: 15,
                    ),
                    FloatingActionButton(
                      onPressed: () {
                        String message = messageContoller.text;
                        setState(() {
                          messages.add(ChatMessage(messageContent: message, messageType: "sender"));              
                          messages.add(ChatMessage(messageContent: messageStrings[messageIndex], messageType: "receiver"));                                        
                        });
                        messageIndex++;
                        for(int i = 0; i < messages.length; i++){
                          print(messages[i].messageContent);
                        }
                      },
                      child: Icon(
                        Icons.send,
                        color: Colors.white,
                        size: 18,
                      ),
                      backgroundColor: Colors.blue,
                      elevation: 0,
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“../models/chats.dart”;
类ReportPage扩展了StatefulWidget{
构建语境;
报告页(本.上下文);
@凌驾
_ReportPageState createState()=>ReportPageState();
}
类_ReportPageState扩展状态{
@凌驾
小部件构建(对象上下文){
TextEditingController messageContoller=新的TextEditingController();
//bot发送的前两条消息已添加到列表中
列表消息=[
ChatMessage(messageContent:“Message 1”,messageType:“receiver”),
ChatMessage(messageContent:“Message 2”,messageType:“receiver”),
];
int messageIndex=0;
//用户响应后要添加到列表中的下一条消息
列表消息字符串=[“消息3”、“消息4”、“消息5”、];
返回脚手架(
appBar:appBar(
标题:世界其他地区(儿童:[
容器(
宽度:35,
身高:35,
子:Image.asset(
“assets/images/police.png”,
适合:BoxFit.cover,
),
装饰:
盒子装饰(形状:盒子形状。圆圈,颜色:颜色。白色),
),
大小盒子(
宽度:10,
),
文本(“CFB bot”),
]),
),
主体:容器(
填充:边缘设置。全部(20),
子:堆栈(
儿童:[
ListView.builder(
itemCount:messages.length,
收缩膜:对,
填充:仅限边缘设置(顶部:10,底部:10),
物理学:NeverscrollableScroll物理学(),
itemBuilder:(上下文,索引){
返回容器(
衬垫:
仅限边集(左:14,右:14,顶部:10,底部:10),
子对象:对齐(
对齐:(消息[索引]。消息类型==“接收者”
?左上角对齐
:对齐。右上角),
子:容器(
装饰:盒子装饰(
边界半径:边界半径。圆形(20),
颜色:(消息[索引]。消息类型==“接收者”
?颜色。灰色。阴影200
:Colors.blue[200]),
),
填充:边缘设置。全部(16),
子:文本(
消息[索引]。消息内容,
样式:TextStyle(字体大小:15),
),
),
),
);
},
),
对齐(
对齐:对齐。左下角,
子:容器(
装饰:盒子装饰(
边框:边框。全部(颜色:颜色。黑色),
borderRadius:borderRadius.all(半径.圆形(20)),
填充:仅限边设置(左:10,下:10,上:10),
身高:60,
宽度:double.infinity,
孩子:排(
儿童:[
手势检测器(
onTap:(){},
子:容器(
身高:30,
宽度:30,
装饰:盒子装饰(
颜色:颜色。浅蓝色,
边界半径:边界半径。圆形(30),
),
子:图标(
Icons.add,
颜色:颜色,白色,
尺码:20,
),
),
),
大小盒子(
宽度:15,
),
扩大(
孩子:TextField(
装饰:输入装饰(
hintText:“写消息…”,
hintStyle:TextStyle(颜色:Colors.black54),
边框:InputBorder.none),
控制器:messagecontroller,
),
),
大小盒子(
宽度:15,
),
浮动操作按钮(
已按下:(){
字符串message=messageContoller.text;
设置状态(){
messages.add(ChatMessage(messageContent:message,messageType:sender));
添加(ChatMessage(messageContent:messageStrings[messageIndex],messageType:“receiver”);
});
messageIndex++;
for(int i=0;imessages = [
    ...messages,
    ChatMessage(messageContent: message, messageType: "sender"),
    ChatMessage(messageContent: messageStrings[messageIndex], messageType: "receiver")
];