Flutter 如何向Scaffold小部件动态添加子部件

Flutter 如何向Scaffold小部件动态添加子部件,flutter,flutter-layout,Flutter,Flutter Layout,比如说,我有一个聊天屏幕,看起来像这样 现在,当用户单击“准备就绪时按”按钮时,将调用方法fetchNewQuestion() 我的意图是,这将发出一个HTTP请求,并使用 _buildUsersReply(httpResponse); 但是,问题是这个返回必须在当前scaffold的小部件中作为现有子部件下的子部件进行,以便在底部构建它,而之前的子部件仍然存在。结果如下: 你可以找到我的完整代码 这是否可以按专业语法进行?还是我必须改变我如何做到这一点的观念 [更新,我现在了解到我的上述

比如说,我有一个聊天屏幕,看起来像这样

现在,当用户单击“准备就绪时按”按钮时,将调用方法
fetchNewQuestion()

我的意图是,这将发出一个HTTP请求,并使用

_buildUsersReply(httpResponse);
但是,问题是这个返回必须在当前scaffold的小部件中作为现有子部件下的子部件进行,以便在底部构建它,而之前的子部件仍然存在。结果如下:

你可以找到我的完整代码

这是否可以按专业语法进行?还是我必须改变我如何做到这一点的观念

[更新,我现在了解到我的上述方法是错误的,我必须使用listview生成器。下面的CurrentStatus显示了我在实现该目标方面的进展。]


当前状态: 我已经建立了一个小部件列表:

List<Widget> chatScreenWidgets = []; 
现在,我不知道如何在脚手架内传递小部件。我写了一些不起作用的代码。例如,我尝试了以下方法:

下图和要点中的代码:


忘掉脚手架吧,这个想法是关于你真正想要改变的东西,让我们假设它是 列表和你从数组中获取数据如果你更新了数组,那么列表就会更新,如果它是另一种类型的小部件,那么你可以用不同的方式处理它。如果你澄清了小部件中每个部分的作用,我会编辑这个答案,因为我无法阅读你的完整代码


  • 首先,您必须创建一个具有两个属性的对象,一个是行的类型(如果是用户重播或其他消息),第二个属性是字符串或文本
  • 现在,从上面的对象在listview类中创建一个全局列表,这样您就可以从用户或甚至作为新闻获取数据,并从上面的类中创建一个新对象,将数据添加到其中,然后将其添加到列表中
  • item builder返回一个小部件,因此根据您返回的小部件,将设置行,因此根据对象中的数据调用一个函数,该函数返回视图,如_buildUsersReply(字符串文本)

  • 如果您有任何其他问题,您可以问:)如果这是您需要的,请将其标记为答案。

    仅供将来参考,以下是我真正需要做的:

    1.创建小部件列表

    List chatScreenWidgets=[]

    2.在我的方法中,我需要使用一个setState来向该列表添加元素。我添加到其中的每个小部件都将显示在脚手架上

    `setState(() {
           chatScreenWidgets.add(_buildUsersReply("Some Text"));
        });`
    
    3.然后,将其加载到我的Scaffold中,我使用itemBuilder将小部件列表返回到我的ListView。我已经有了这个ListView(在这里我手动添加了孩子)。现在,这只是通过我的业务逻辑方法中的setState方法返回它们(在本例中为
    fetchNewQuestion()

    body:Stack(
    儿童:[
    填充物(
    填充:仅限边设置(底部:0),
    子项:新建ListView.builder(
    物理:弹跳CrollPhysics(),
    填充:边缘组。对称(水平:25),
    itemCount:chatScreenWidgets.length,
    itemBuilder:(BuildContext上下文,int itemCount){
    返回chatScreenWidgets[itemCount];
    }
    ),
    ),
    ],
    ),
    );`
    

    我希望这有助于未来的颤振工程师

    如果您的scaffold位于一个有状态的小部件中,您可以将子部件分配给一个List类型的变量,然后当请求返回时,只需调用setState(()=>_scaffoldchilds=…)或类似的东西。是的,它是一个有状态的小部件。但我无法理解如何实现
    \u scaffoldChildren=…
    想法。任何进一步的解释都很好。此外,当我尝试将children:转换为children:List时,我遇到了一个错误
    运算符<未为类类型定义
    ,并且
    等式表达式不能是另一个等式的操作数
    。感谢您的帮助。这是一个完整的例子:我理解。让我知道你想知道更多关于代码的哪一部分。为了给你一个基本的想法,我有一个
    \u buildUsersReply()获取字符串并创建聊天泡泡的小部件生成器。类似地,我的主框架/小部件位于这个链接()中,我已经评论了我想在这个链接中构建聊天泡泡的位置。目前我可以手动添加它们。我只是想自动化这项工作。我已经在上一个文件的底部指出了这些。好的,检查listview生成器上方的链接当我看到你的代码时,我发现你只使用带有编码子项的listview,所以基本上你必须添加listview生成器,在item builder中,你将有一个行索引,我将编辑详细答案,谢谢。你能再核对一下这个问题吗?在最后一部分中,我添加了一些内容,试图模仿您使用项目生成器的建议。我正在尝试创建一个小部件列表,并使用setState()更新它。现在的主要问题是如何在原始的scaffold中返回/显示它(如何编写itemBuilder以接受我的小部件列表)。您可以在上述问题的最后一个细节处找到当前代码。请忽略。我已经用小部件解决了这个问题。非常感谢你!
    
    `setState(() {
           chatScreenWidgets.add(_buildUsersReply("Some Text"));
        });`
    
    body: Stack(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(bottom: 0),
            child: new ListView.builder(
              physics: BouncingScrollPhysics(),
              padding: EdgeInsets.symmetric(horizontal: 25),
              itemCount: chatScreenWidgets.length,
                itemBuilder: (BuildContext context, int itemCount) {
                  return chatScreenWidgets[itemCount];
                }
            ),
          ),
              ],
            ),
          );`