flutter - ListTile中具有图像和标签的Flutter左对齐列将不会垂直扩展并裁剪图像

标签 flutter dart

我正在开发Flutter聊天实现,对于每个聊天左对齐的消息,我希望ListTile从包含2个小部件的列开始:

  • 用户头像
  • 他们的名字在
  • 以下

    我遇到的问题是列将不会扩展,并且图像会被裁剪。这是一个例子。我尝试了2种变化,其中尝试将高/宽设置为70,然后设置为100。在两种情况下,我都得到相同的结果。当我在名字和姓氏之间添加换行符时,姓氏变为“屏幕外”。

    什么是实现这种布局的正确方法,以使ListTile仅扩展所需的内容(对于提供的内容)?

    enter image description here

    下面是我试图使此工作的代码。

    注意此行:bool isNameShown = false;。使用它来切换错误情况的状态。

    这是一个独立工作的文件,可以复制到新的.dart文件中并运行。感谢您的关注。
    import 'package:flutter/material.dart';
    
    void main() => runApp(AvatarChatListDemo());
    
    class AvatarChatListDemo extends StatefulWidget {
      @override
      _AvatarChatListDemoState createState() => _AvatarChatListDemoState();
    }
    
    class _AvatarChatListDemoState extends State<AvatarChatListDemo> {
    
      var imagePath = 'assets/images/lion.jpeg';
      List chatHistory = ['Hello there Sam', 'Hi Bob, Good day '];
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(appBar: null, body: getChatMessageList()));
      }
    
      Widget getChatMessageList() {
        bool isNameShown = true; // Use this to toggle the state for the error case.
    
        return ListView.builder(
          itemCount: chatHistory.length,
          itemBuilder: (BuildContext context, int index) {
            return getNextChatListTile(index, isNameShown);
          },
        );
      }
    
      double dim = 100;
      ListTile getNextChatListTile(int chatMessageIndex, bool isNameShown) {
        var chatMessage = chatHistory[chatMessageIndex];
    
        Image leftSideAvatarImage =
            Image.asset(imagePath, width: dim, height: dim, fit: BoxFit.cover);
    
        List<Widget> columnWidgets = [
          Expanded(child: leftSideAvatarImage),
        ];
    
        if (isNameShown) {
          columnWidgets.add(Expanded(
              child: Text('Matt Houston',
                  style: TextStyle(color: Colors.green, fontSize: 20))));
        }
    
        Column leftSideAvatarColumn = Column(
            mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.start,
            children: columnWidgets);
    
        Container messageContainer = Container(
            padding: EdgeInsets.all(15),
            color: Colors.white,
            child: Text(chatMessage, style: TextStyle(fontSize: 20)));
    
        return ListTile(
            contentPadding: EdgeInsets.all(5),
            leading: leftSideAvatarColumn,
            title: messageContainer);
      }
    }   
    

    最佳答案

    像那样?

    enter image description here

    import 'package:flutter/material.dart';
    
    void main() => runApp(AvatarChatListDemo());
    
    class AvatarChatListDemo extends StatefulWidget {
      @override
      _AvatarChatListDemoState createState() => _AvatarChatListDemoState();
    }
    
    class _AvatarChatListDemoState extends State<AvatarChatListDemo> {
      var imagePath = 'assets/images/lion.jpg';
      List chatHistory = ['Hello there Sam', 'Hi Bob, Good day '];
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            home: Scaffold(appBar: null, body: getChatMessageList()));
      }
    
      Widget getChatMessageList() {
        bool isNameShown = true; // Use this to toggle the state for the error case.
    
        return ListView.builder(
          itemCount: chatHistory.length,
          itemBuilder: (BuildContext context, int index) {
            return getNextChatListTile(index, isNameShown);
          },
        );
      }
    
      double dim = 100;
      Widget getNextChatListTile(int chatMessageIndex, bool isNameShown) {
        var chatMessage = chatHistory[chatMessageIndex];
    
        Image leftSideAvatarImage =
            Image.asset(imagePath, width: dim, height: dim, fit: BoxFit.contain);
    
        List<Widget> columnWidgets = [
          leftSideAvatarImage,
        ];
    
        if (isNameShown) {
          columnWidgets.add(
            Text(
              'Matt Houston',
              style: TextStyle(color: Colors.green, fontSize: 15),
            ),
          );
        }
    
        var leftSideAvatarColumn = ConstrainedBox(
          constraints: BoxConstraints(maxWidth: 100),
          child: Column(
              mainAxisSize: MainAxisSize.max,
              mainAxisAlignment: MainAxisAlignment.start,
              children: columnWidgets),
        );
    
        Container messageContainer = Container(
            padding: EdgeInsets.all(15),
            color: Colors.white,
            child: Text(chatMessage, style: TextStyle(fontSize: 20)));
    
        return Padding(
            padding: const EdgeInsets.all(5.0),
            child: Row(
              children: <Widget>[leftSideAvatarColumn, messageContainer],
            ));
      }
    }
    

    关于flutter - ListTile中具有图像和标签的Flutter左对齐列将不会垂直扩展并裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62221542/

    相关文章:

    flutter - 在 flutter MaterialApp 小部件中使用 ThemeData copyWith 的正确方法是什么?

    flutter - 如何在Flutter中使用默认情况下的不可为空?

    dart - 一个好的做法是将 Widgets 作为 flutter 中的类参数传递吗?

    flutter - AppBar flutter 中 IconButton 内的 ExpansionTile

    image - Flutter::Amazon S3 图像上传

    flutter - 如何将按钮放置在屏幕的底部中央?

    firebase - 注销错误 Cloud Firestore。调用者无权执行指定操作

    flutter - 为什么这个 Flutter 示例没有 return 关键字?

    flutter - 如何对齐行/列的子级?

    Dart 如何创建一个可以接受任意数量参数的函数