Flutter 此自定义列表项布局要使用哪些小部件

Flutter 此自定义列表项布局要使用哪些小部件,flutter,Flutter,您能否提供一些建议,说明如何使用最佳小部件来实现下面所需的列表项外观 下面是所需外观的列表项: 以下是我的列表项的外观: 下面是我的代码。您能否提供一些建议,说明如何使用最佳小部件来实现所需的列表项外观?我最大的问题是缩略图部件没有延伸到相同的宽度和高度。缩略图中的图像应刚好覆盖可用区域 class MyScreenState extends State<MyScreen> { @override Widget build(BuildContext context) {

您能否提供一些建议,说明如何使用最佳小部件来实现下面所需的列表项外观

下面是所需外观的列表项:
以下是我的列表项的外观:

下面是我的代码。您能否提供一些建议,说明如何使用最佳小部件来实现所需的列表项外观?我最大的问题是缩略图部件没有延伸到相同的宽度和高度。缩略图中的图像应刚好覆盖可用区域

class MyScreenState extends State<MyScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: new ListView.builder(
        itemCount: users.length,
        shrinkWrap: true,
        itemExtent: 200, // Need a constant item height of 200
        itemBuilder: (context, i) => new Column(
          children: <Widget>[
            new Divider(
              height: 10.0,
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 5.0),
              child: Row(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Expanded(
                      flex: 2,
                      child: Padding(
                        padding: EdgeInsets.all(5.0),
                        child: ClipRRect(
                          borderRadius: BorderRadius.circular(5.0),
                          child: Image.network(
                            users[i].profile.avatarUrl,
                            fit: BoxFit.cover,
                          ),
                        ),
                      )
                  ),
                  Expanded(
                    flex: 3,
                    child: Padding(
                      padding: const EdgeInsets.fromLTRB(5.0, 0.0, 0.0, 0.0),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Text(
                            "John Smith",
                            style: const TextStyle(
                              fontWeight: FontWeight.w500,
                              fontSize: 14.0,
                            ),
                          ),
                          const Padding(padding: EdgeInsets.symmetric(vertical: 2.0)),
                          Text(
                            "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt",
                            style: const TextStyle(fontSize: 10.0),
                          ),
                          const Padding(padding: EdgeInsets.symmetric(vertical: 1.0)),
                          Text(
                            '8 Years',
                            style: const TextStyle(fontSize: 10.0),
                          ),
                        ],
                      ),
                    ),
                  ),
                  const Icon(
                    Icons.more_vert,
                    size: 16.0,
                  ),
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}
类MyScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:新建ListView.builder(
itemCount:users.length,
收缩膜:对,
itemExtent:200,//需要200的恒定项目高度
itemBuilder:(上下文,i)=>新列(
儿童:[
新分隔器(
身高:10.0,
),
填充物(
填充:常量边集。对称(垂直:5.0),
孩子:排(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
扩大(
弹性:2,
孩子:填充(
填充:所有边缘设置(5.0),
孩子:ClipRRect(
边界半径:边界半径。圆形(5.0),
孩子:Image.network(
用户[i].profile.avatarUrl,
适合:BoxFit.cover,
),
),
)
),
扩大(
弹性:3,
孩子:填充(
填充:LTRB(5.0,0.0,0.0,0.0)中的常量边集,
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
正文(
“约翰·史密斯”,
样式:consttextstyle(
fontWeight:fontWeight.w500,
字体大小:14.0,
),
),
常量填充(填充:EdgeInsets.symmetric(垂直:2.0)),
正文(
“Lorem ipsum dolor sit amet,奉献精英,为临时雇主服务”,
样式:常量文本样式(fontSize:10.0),
),
常量填充(填充:EdgeInsets.symmetric(垂直:1.0)),
正文(
“8年”,
样式:常量文本样式(fontSize:10.0),
),
],
),
),
),
常量图标(
图标。更多信息,
尺寸:16.0,
),
],
),
)
],
),
),
);
}
}

在这种情况下,您应该限制图像的大小。你可以用几种方法来做

第一:

Image.network(imageUrl,fit:BoxFit.fitWidth,),

第二:

width:MediaQuery.of(context).size.width,


或者只声明每个图像的高度和宽度。

在这种情况下,您应该限制图像的大小。你可以用几种方法来做

第一:

Image.network(imageUrl,fit:BoxFit.fitWidth,),

第二:

width:MediaQuery.of(context).size.width,


或者只声明每个图像的高度和宽度。

您需要将
填充
小部件包装为
展开
像这样

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',

      home: Scaffold(body: MyScreen()),
    );
  }
}


class MyScreen extends StatefulWidget {
  @override
  MyScreenState createState() => MyScreenState();
}

class MyScreenState extends State<MyScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: 10,
        shrinkWrap: true,
        itemExtent: 200, // Need a constant item height of 200
        itemBuilder: (context, i) => Column(
          children: <Widget>[
            Divider(
              height: 10.0,
            ),
            Expanded( // MAGIC IS HERE <--------
              child: Padding(
                padding: const EdgeInsets.symmetric(vertical: 5.0),
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Expanded(
                        flex: 2,
                        child: Padding(
                          padding: EdgeInsets.all(5.0),
                          child: ClipRRect(
                            borderRadius: BorderRadius.circular(5.0),
                            child: Image.network(
                              'https://i.picsum.photos/id/896/200/300.jpg?hmac=sgs51khfREKwE_t-0S7LpXpYz2CBlBAoeXTFuoHo-l4',
                              fit: BoxFit.cover,
                            ),
                          ),
                        )
                    ),
                    Expanded(
                      flex: 3,
                      child: Padding(
                        padding: const EdgeInsets.fromLTRB(5.0, 0.0, 0.0, 0.0),
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            Text(
                              "John Smith",
                              style: const TextStyle(
                                fontWeight: FontWeight.w500,
                                fontSize: 14.0,
                              ),
                            ),
                            const Padding(padding: EdgeInsets.symmetric(vertical: 2.0)),
                            Text(
                              "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt",
                              style: const TextStyle(fontSize: 10.0),
                            ),
                            const Padding(padding: EdgeInsets.symmetric(vertical: 1.0)),
                            Text(
                              '8 Years',
                              style: const TextStyle(fontSize: 10.0),
                            ),
                          ],
                        ),
                      ),
                    ),
                    const Icon(
                      Icons.more_vert,
                      size: 16.0,
                    ),
                  ],
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主页:脚手架(主体:MyScreen()),
);
}
}
类MyScreen扩展StatefulWidget{
@凌驾
MyScreenState createState()=>MyScreenState();
}
类MyScreenState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:ListView.builder(
物品计数:10,
收缩膜:对,
itemExtent:200,//需要200的恒定项目高度
itemBuilder:(上下文,i)=>列(
儿童:[
分隔器(
身高:10.0,
),

Expanded(//MAGIC在这里您需要用
Expanded
像这样

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',

      home: Scaffold(body: MyScreen()),
    );
  }
}


class MyScreen extends StatefulWidget {
  @override
  MyScreenState createState() => MyScreenState();
}

class MyScreenState extends State<MyScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: 10,
        shrinkWrap: true,
        itemExtent: 200, // Need a constant item height of 200
        itemBuilder: (context, i) => Column(
          children: <Widget>[
            Divider(
              height: 10.0,
            ),
            Expanded( // MAGIC IS HERE <--------
              child: Padding(
                padding: const EdgeInsets.symmetric(vertical: 5.0),
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: <Widget>[
                    Expanded(
                        flex: 2,
                        child: Padding(
                          padding: EdgeInsets.all(5.0),
                          child: ClipRRect(
                            borderRadius: BorderRadius.circular(5.0),
                            child: Image.network(
                              'https://i.picsum.photos/id/896/200/300.jpg?hmac=sgs51khfREKwE_t-0S7LpXpYz2CBlBAoeXTFuoHo-l4',
                              fit: BoxFit.cover,
                            ),
                          ),
                        )
                    ),
                    Expanded(
                      flex: 3,
                      child: Padding(
                        padding: const EdgeInsets.fromLTRB(5.0, 0.0, 0.0, 0.0),
                        child: Column(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            Text(
                              "John Smith",
                              style: const TextStyle(
                                fontWeight: FontWeight.w500,
                                fontSize: 14.0,
                              ),
                            ),
                            const Padding(padding: EdgeInsets.symmetric(vertical: 2.0)),
                            Text(
                              "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt",
                              style: const TextStyle(fontSize: 10.0),
                            ),
                            const Padding(padding: EdgeInsets.symmetric(vertical: 1.0)),
                            Text(
                              '8 Years',
                              style: const TextStyle(fontSize: 10.0),
                            ),
                          ],
                        ),
                      ),
                    ),
                    const Icon(
                      Icons.more_vert,
                      size: 16.0,
                    ),
                  ],
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主页:脚手架(主体:MyScreen()),
);
}
}
类MyScreen扩展StatefulWidget{
@凌驾
MyScreenState createState()=>MyScreenState();
}
类MyScreenState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:ListView.builder(
物品计数:10,
收缩膜:对,
itemExtent:200,//需要200的恒定项目高度
itemBuilder:(上下文,i)=>列(
儿童:[
分隔器(
身高:10.0,
),
展开(//魔法在这里