Flutter 将 FutureBuilder 小部件放在一个 Column 中

Posted

技术标签:

【中文标题】Flutter 将 FutureBuilder 小部件放在一个 Column 中【英文标题】:Flutter put FutureBuilder widget inside a Column 【发布时间】:2019-02-19 11:58:33 【问题描述】:

我有一个 FutureBuilder 小部件,它从服务器检索聊天(或者更确切地说是更新)并显示它们。代码如下:

Future<List<Chat>> fetchChats(http.Client client, String providerUUID) async 
  returns List<Chat>..


class ProviderChats extends StatelessWidget 
  final List<Chat> chats;
  final String providerUUID;

  ProviderChats(this.chats, this.providerUUID);

  @override
  Widget build(BuildContext context) 
    return FutureBuilder<List<Chat>>(
      future: fetchChats(http.Client(), providerUUID),
      builder: (context, snapshot)
        if(snapshot.hasError) print(snapshot.error);

        return snapshot.hasData ?
        ChatsListWidgetClass(chats: snapshot.data) :
        Center(child: CircularProgressIndicator());
      ,
    );
  


class ChatsListWidgetClass extends StatelessWidget 
  final List<Chat> chats;

  ChatsListWidgetClass(this.chats);

  @override
  Widget build(BuildContext context) 
    return ListView.builder(
      itemCount: chats.length,
      itemBuilder: (context, index) 
        return Card(
          elevation: 10.0,
          child: Column(
            children: <Widget>[
              Text(
                chats[index].message,
              ),
              Text(
                chats[index].createdAt,
              ),
            ],
          ),
        );
      ,
    );
  

看起来像这样:

在屏幕底部,我想显示一个带有发送按钮的 TextField(就像我们在聊天屏幕上看到的一样)。但我无法在 Column 中容纳我的 ListView.builder。

有没有办法让列表从顶部占据 80% 的垂直空间,让发送文本字段占据底部 20%。基本上就像一个聊天应用程序窗口。

【问题讨论】:

您可以将 textField 添加为 listView 中的最后一个元素吗(itemCount: chats.length + 1) ? 【参考方案1】:

使用 Remi 的回复这对我有用

     return new Scaffold(
      appBar: new AppBar(
        title: new Text("Home Page"),
      ),
      body: new Builder(
          builder: (BuildContext context) 
            return Column(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: <Widget>[
                Expanded(
                  flex: 8,
                  child: futureBuilder,
                ),
                Expanded(
                  flex: 2,
                  child: Text("hello"),
                  ),

              ],
            );
        
      )
    );

【讨论】:

【参考方案2】:

您可以使用带有自定义权重的Expanded 以百分比填充列

Column(
  children: <Widget>[
    Expanded(
      flex: 8,
      child: Container(
        color: Colors.red,
      ),
    ),
    Expanded(
      flex: 2,
      child: Container(
        color: Colors.blue,
      ),
    ),
  ],
);

【讨论】:

以上是关于Flutter 将 FutureBuilder 小部件放在一个 Column 中的主要内容,如果未能解决你的问题,请参考以下文章

Flutter FutureBuilder 小部件动态列表长度

使用 Futurebuilder 有条件地渲染小部件

如何在 FutureBuilder Flutter 中停止循环 SetState

Flutter + SharedPreferences:如何使用 FutureBuilder

Flutter 使用 FutureBuilder 检索列表中的数据

FutureBuilder 能够获取数据,但使用 Flutter 多次获取数据