Flutter 带行的图标按钮
在这段代码中,我希望将IconButton放在每个ItemView的右上角。ItemDescription和ItemTitle居中于顶部。我试着把它们放在同一排,但是我不能把它们放在一起,要么ICONBUT要么粘在文本上,要么就在中间。 我认为这很容易,但我没有找到解决办法 代码如下:Flutter 带行的图标按钮,flutter,dart,row,iconbutton,Flutter,Dart,Row,Iconbutton,在这段代码中,我希望将IconButton放在每个ItemView的右上角。ItemDescription和ItemTitle居中于顶部。我试着把它们放在同一排,但是我不能把它们放在一起,要么ICONBUT要么粘在文本上,要么就在中间。 我认为这很容易,但我没有找到解决办法 代码如下: import 'package:flutter/material.dart'; import 'package:cached_network_image/cached_network_image.dart'; i
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import '../recyclerview/data.dart';
import 'package:watch/constants.dart';
class ListViewExample extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new ListViewExampleState(
);
}
}
class ListViewExampleState extends State<ListViewExample>{
List<Container> _buildListItemsFromItems(){
int index = 0;
return item.map((item){
var container = Container(
decoration: index % 2 == 0?
new BoxDecoration(color: const Color(0xFFFFFFFF)):
new BoxDecoration(
color: const Color(0xFFFAFAF5)
),
child: new Row(
children: <Widget>[
new Container(
margin: new EdgeInsets.all(5.0),
child: new CachedNetworkImage(
imageUrl: item.imageURL,
width: 200.0,
height: 100.0,
fit: BoxFit.cover,
),
),
Expanded(
child: Row(
children: <Widget>[
new Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
padding: const EdgeInsets.only(bottom: 75.0 ),
child: Text(
item.title,
style: kItemTitle,
),
),
Container(
padding: const EdgeInsets.only(left: 15.0),
child:Text(
item.description,
style: kItemDescription,
),
),
],
),
new Row(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
child: IconButton(
icon: Icon(Icons.favorite_border, color: Colors.black,),
iconSize: 24.0,
onPressed: null
),
)
],)
]),
),
]),
);
index = index + 1;
return container;
}).toList();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text('Accueil', style: kAppBarStyle,),
backgroundColor: Colors.white,
elevation: 0,
),
body: ListView(
children: _buildListItemsFromItems(),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:cached_network_image/cached_network_image.dart”;
导入“../recyclerview/data.dart”;
导入“package:watch/constants.dart”;
类ListViewExample扩展StatefulWidget{
@凌驾
状态createState(){
返回新的ListViewExampleState(
);
}
}
类ListViewExampleState扩展状态{
列表_buildListItemsFromItems(){
int指数=0;
返回item.map((item){
var container=容器(
装饰:索引%2==0?
新的盒子装饰(颜色:常量颜色(0xFFFFFF)):
新盒子装饰(
颜色:常量颜色(0xFFFAF5)
),
孩子:新的一排(
儿童:[
新容器(
边距:所有新边集(5.0),
子级:新建CachedNetworkImage(
imageUrl:item.imageUrl,
宽度:200.0,
高度:100.0,
适合:BoxFit.cover,
),
),
扩大(
孩子:排(
儿童:[
新行(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
填充:仅限常量边集(底部:75.0),
子:文本(
项目名称,
风格:kItemTitle,
),
),
容器(
填充:仅限常量边集(左:15.0),
子:文本(
项目名称:,
风格:kItemDescription,
),
),
],
),
新行(
mainAxisAlignment:mainAxisAlignment.end,
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
容器(
孩子:我的钮扣(
图标:图标(Icons.favorite_边框,颜色:Colors.black,),
iconSize:24.0,
onPressed:null
),
)
],)
]),
),
]),
);
指数=指数+1;
返回容器;
}).toList();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:appBar(
标题:文本('Accueil',样式:kAppBarStyle,),
背景颜色:Colors.white,
海拔:0,
),
正文:ListView(
子项:\ u buildListItemsFromItems(),
),
);
}
}
更新:我添加了一个
间隔符()
,并将所有内容放在同一行中,并将CrossAxisAlignment设置为.center。将图标与标题和说明放在同一行中,中间有一个。这将给你一个溢出错误,因为间隔想要占据尽可能多的物理空间,所以没有限制,它会无限大。要告诉间隔符只允许有限的空间,必须将行的mainAxisSize设置为mainAxisSize.min
这是代码,经过一些修改,我可以自己运行它
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ListViewExample(),
);
}
}
class ListViewExample extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new ListViewExampleState();
}
}
class ListViewExampleState extends State<ListViewExample> {
var items = [
Item(),
Item(),
Item(),
Item(),
];
List<Container> _buildListItemsFromItems() {
int index = 0;
return items.map(
(item) {
var container = Container(
decoration: index % 2 == 0
? new BoxDecoration(color: const Color(0xFFFFFFFF))
: new BoxDecoration(color: const Color(0xFFFAFAF5)),
child: new Row(
children: <Widget>[
new Container(
margin: new EdgeInsets.all(5.0),
child: new Container(
color: Colors.red,
width: 150.0,
height: 100.0,
),
),
Expanded(
child: new Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
padding: const EdgeInsets.only(bottom: 75.0),
child: Text(
item.title,
),
),
Container(
padding: const EdgeInsets.only(left: 15.0),
child: Text(
item.description,
),
),
Spacer(),
GestureDetector(
child: Icon(
Icons.favorite_border,
size: 14,
color: Colors.black,
),
onTap: null,
),
],
),
),
],
),
);
index = index + 1;
return container;
},
).toList();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: AppBar(
title: Text('Accueil'),
backgroundColor: Colors.white,
elevation: 0,
),
body: ListView(
children: _buildListItemsFromItems(),
),
);
}
}
class Item {
final String title;
final String description;
Item({this.title = 'FooTitle', this.description = 'BarDescription'});
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:ListViewExample(),
);
}
}
类ListViewExample扩展StatefulWidget{
@凌驾
状态createState(){
返回新的ListViewExampleState();
}
}
类ListViewExampleState扩展状态{
可变项目=[
项(),
项(),
项(),
项(),
];
列表_buildListItemsFromItems(){
int指数=0;
返回items.map(
(项目){
var container=容器(
装饰:索引%2==0
?新的盒子装饰(颜色:常量颜色(0xFFFFFF))
:新框装饰(颜色:常量颜色(0xFFFAF5)),
孩子:新的一排(
儿童:[
新容器(
边距:所有新边集(5.0),
子容器:新容器(
颜色:颜色,红色,
宽度:150.0,
高度:100.0,
),
),
扩大(
孩子:新的一排(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.start,
mainAxisSize:mainAxisSize.min,
儿童:[
容器(
填充:仅限常量边集(底部:75.0),
子:文本(
项目名称,
),
),
容器(
填充:仅限常量边集(左:15.0),
子:文本(
项目名称:,
),
),
垫片(),
手势检测器(
子:图标(
图标。最喜爱的边框,
尺码:14,
颜色:颜色,黑色,
),
onTap:null,
),
],
),
),