在这段代码中,我试图在页面的最顶部创建一个按钮或图块列表,“因为按钮对我来说效果不佳”。因此,当单击其中一个时,它会在页面的其余部分返回一个值。
问题是这里的图块占据了页面的一半以上,这使得它看起来不一致。我想限制瓷砖的高度,我尝试将它们放在一排和一个容器中,但它不起作用。任何帮助将不胜感激。
运行代码后的结果是:
class HomePage extends StatefulWidget {
// const HomePage({Key key}) : super(key: key);
@override
HomePageState createState() {
return new HomePageState();
}
}
class HomePageState extends State<HomePage> {
List<String> temp=new List();
List<String> temp1=['Nile University', 'Smart Village', 'Zewail'];
Map<String,String> map1={};
@override
void initState() {
super.initState();
getplaces(temp);
getuser(map1,'1jKpg81YCO5PoFOa2wWR');
}
Future<List> getuser(temp,String place) async{
List<String> userids=[];
QuerySnapshot usersubs= await Firestore.instance.collection('tempSubs').getDocuments();
QuerySnapshot userid= await Firestore.instance.collection('users').where('place',isEqualTo: place).getDocuments();
userid.documents.forEach((DocumentSnapshot doc,){
usersubs.documents.forEach((DocumentSnapshot doc1){
if(doc.documentID==doc1.documentID){
doc1.data['products'].forEach((k,v){
if( DateTime.fromMillisecondsSinceEpoch(v).day==DateTime.now().day){
int x= DateTime.fromMillisecondsSinceEpoch(v).day;
print('keey equal $k and v is $x');
print('dy is $x');
userids.add(
doc.documentID);
}
});
}
} ); }
);
print('doc.documentID');
print (userids);
setState(() {});
return userids;
}
Future<List> getplaces(temp) async{
QuerySnapshot place= await Firestore.instance.collection('places').getDocuments();
place.documents.forEach((DocumentSnapshot doc){
temp.add(
doc.data['name']
);
// print(doc.data['name']);
});
// print(temp);
setState(() {});
return temp;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Home Page"),
),
body: !temp.isNotEmpty?
CircularProgressIndicator():
Row(mainAxisSize:MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children:<Widget>[
Container(
height: 100.0,
child:
ListView.builder(
scrollDirection: Axis.horizontal,
itemExtent: 100.0,
itemCount:temp.length,
itemBuilder:(BuildContext context, int index) {
return ListTile(title: Text(temp[index]),onTap:
(){
print(temp[index]);
}
);}
),),
Container(child:Text('data'),)
],),
);
}
}
应用
VisualDensity
允许您扩大或缩小列表图块的高度。 VisualDensity 是 UI 元素的紧凑度。这是一个例子:
// negative value to contract
ListTile(
title: Text('Tile title'),
dense: true,
visualDensity: VisualDensity(vertical: -3), // to compact
onTap: () {
// tap actions
},
)
// positive value to expand
ListTile(
title: Text('Tile title'),
dense: true,
visualDensity: VisualDensity(vertical: 3), // to expand
onTap: () {
// tap actions
},
)
值范围从 -4 到 4,在编写此答案时默认值为 0。
但是,对于特定的宽度或高度尺寸,您不能使用此方法。
只需删除
Expanded
Widget 即可避免填充可用空间,并使用具有固定高度的父容器,与 itemExtent
值相同:
Column(
children: <Widget>[
Container(
height: 100.0,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemExtent: 100.0,
itemCount: temp.length,
itemBuilder: (BuildContext context, int index) {
return ListTile(
title: Text(temp[index]),
onTap: () {
print(temp[index]);
});
}),
),
Container(
child: Text('data'),
)
],
),
如果您需要更多自定义,您应该使用 Container 或 Padding 而不是 ListTile。
您无法设置高度,但可以通过将 dense 属性设置为 true 来使其更小:
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(list[index].name,style: TextStyle(fontSize: 20.0),),
contentPadding: EdgeInsets.symmetric(vertical: 0.0, horizontal: 16.0),
dense:true,
);
},
);
列表图块:
一个固定高度的行,通常包含一些文本以及 前导或尾随图标。
为了可访问,可点击的前导和尾随小部件必须位于 尺寸至少为 48x48。但是,为了遵守材料规范,尾随 并且单行 ListTiles 中的前导小部件在视觉上应该最多是 高度为 32 (dense: true) 或 40 (dense: false),可能会发生冲突 符合无障碍要求。
因此,单行 ListTile 允许行距和行距的高度 尾随小部件受 ListTile 高度的约束。这 允许创建可点击的前导和尾随小部件 足够大,但这取决于开发商确保他们的 小部件遵循材质规范。
https://api.flutter.dev/flutter/material/ListTile-class.html
由于 ListTile 中没有 height 属性,您可以通过将图块放置在 SizedBox 中来限制图块的大小:
SizedBox(
height: 32,
child: ListTile(..))
也许你可以在
minVerticalPadding
中使用 ListTile
。
ListTile(
minVerticalPadding: 16.w,
title: Text(
_list[index]['label'],
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w600,
),
),
trailing: _list[index]['widget'],
),