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,
),
展开(//魔法在这里