将长文本包装到容器中,导致溢出 Flutter

Posted

技术标签:

【中文标题】将长文本包装到容器中,导致溢出 Flutter【英文标题】:Wrapping long text into a container, causes overflow Flutter 【发布时间】:2020-03-31 03:32:24 【问题描述】:

我正在为我的应用程序创建一个通知中心,它包含一些用于标题和正文的长字符串,它总是会导致溢出,我尝试使用扩展小部件,以及以下这些堆栈溢出问题:Question 1,Question 2 但我无法将它应用到我的代码中,这就是它现在的样子:

我从我的 firebase cloud firestore 获取文本,并使用列表视图输出文本。

标题文本是这样的:“Allen Indefenzo 已撤销同意您访问他/她的数据”正文是这样的:“他/她已删除您的所有访问权限,您将无法再查看/更改他的数据,再次访问要求用户给您他/她再次特殊代码。”

这是我的代码:

Container(
        color: Colors.white,
        child: StreamBuilder(
          stream: db
              .collection('users')
              .document(userData.userID)
              .collection('notifications')
              .snapshots(),
          builder: (BuildContext context, AsyncSnapshot snapshot) 
            if (!snapshot.hasData) 
              return Center(
                child: CircularProgressIndicator(),
              );
            
            if (snapshot.data.documents.length != 0) 
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (BuildContext context, int index) 
                  return Container(
                    child: Row(
                      children: <Widget>[
                        Container(
                          height: 150,
                          width: 100,
                          child: Image(
                            image: NetworkImage(
                                snapshot.data.documents[index]['dpURL']), fit: BoxFit.contain,
                          ),
                        ),
                        Column(
                          children: <Widget>[
                            Container(
                              height: 50,
                              width: MediaQuery.of(context).size.width * 0.8,
                              child:
                                  Text(snapshot.data.documents[index]['title']),
                            ),
                            Container(
                              height: 50,
                              width: MediaQuery.of(context).size.width * 0.8,
                              child:
                                  Text(snapshot.data.documents[index]['body']),
                            ),
                          ],
                        ),
                      ],
                    ),
                  );
                ,
              );
            
          ,
        ),
      ),

感谢您提供任何帮助,如果您能解释一下,那就太棒了!非常感谢!

【问题讨论】:

【参考方案1】:

尝试将您的Column 包裹在Expanded 中,

 Container(
              child: Row(
                children: <Widget>[
                  Container(
                    height: 150,
                    width: 100,
                    child: Image(
                      image: NetworkImage(
                          'https://encrypted-tbn0.gstatic.com/images?q=tbn%3AANd9GcQLBtBU3nUOK7osT41ZsQhP4VBV7fd9euqXvXVKQH0Q7bl4txeD'),
                      fit: BoxFit.contain,
                    ),
                  ),
                  Expanded(
                    child: Column(
                      children: <Widget>[
                        Text(
                            'Reallly looooooooooooooooooooooooooooooong textttttttttttttttttttttttttttttttttttttttttttttttt'),
                        Text(
                            'Reallly looooooooooooooooooooooooooooooong textttttttttttttttttttttttttttttttttttttttttttttttt'),
                      ],
                    ),
                  ),
                ],
              ),
            );

输出:


另外如果你想限制Text使用的行数,

  Text(
'Reallly looooooooooooooooooooooooooooooongtextttttttttttttttttttttttttttttttttttttttttttttttt',
    maxLines: 2,
    overflow: TextOverflow.ellipsis,
                        ),

输出:

【讨论】:

【参考方案2】:

只需将您的列包装在展开的小部件中

Expanded(child: 
               Column(
                          children: <Widget>[
                            Container(
                              height: 50,
                              width: MediaQuery.of(context).size.width * 0.8,
                              child:
                                  Text(snapshot.data.documents[index]['title']),
                            ),
                            Container(
                              height: 50,
                              width: MediaQuery.of(context).size.width * 0.8,
                              child:
                                  Text(snapshot.data.documents[index]['body']),
                            ),
                          ],
      ),
),

当列或行小部件具有 2 个或更多子小部件时,当您想要填充所有剩余空间时,扩展小部件非常有用。因此,将子组件包裹在展开的小部件中会相应地填满剩余空间。

【讨论】:

【参考方案3】:
return Container(child: Row(
                            children: <Widget>[
                              Container(
                                height: 150,
                                width: 100,
                                child: Image(
                                  image: NetworkImage(snapshot.data.documents[index]['dpURL']), fit: BoxFit.contain,
                                ),
                              ),
                             new Expanded(
                                child: Column(
                                  children: <Widget>[
                                    Padding(
                                      padding: const EdgeInsets.all(8.0),
                                      child: TitleText(
                                        text:snapshot.data.documents[index]['title'] ,
                                        maxLine: 5,
                                      ),
                                    ),
                                    Container(
                                      height: 50,
                                      width: MediaQuery.of(context).size.width * 0.8,
                                      child: TitleText(
                                          text:snapshot.data.documents[index]['body']),
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          ),
                        );

【讨论】:

以上是关于将长文本包装到容器中,导致溢出 Flutter的主要内容,如果未能解决你的问题,请参考以下文章

输入元素溢出容器[重复]

具有块内容的 Flexbox 项目溢出 flexbox 容器

将原始 .aac 文件包装到 .m4a 容器中的最简单方法是啥

flutter 布局时内容溢出容器的类似Overflow-hidden的简单解决

如何将长文本文件字段放入列表框?

围绕文本包装容器以用于聊天气泡