我正在寻找一些指导来创建分隔符的列表视图。例如,我想从按日期分组的数据库中获取消息,并按照日期将消息与某些图形或行等分开,然后在分隔符下面显示消息。试试这个扑动,任何指导或推动正确的方向将不胜感激。颤动组列表与分隔符
回答
我的设计的丑陋道歉,但只是为了告诉你,你几乎可以建立自己的设计,你的愿望,这是一个简单的例子:
import "package:flutter/material.dart";
import 'package:meta/meta.dart';
class Test extends StatefulWidget {
@override
_TestState createState() => new _TestState();
}
class _TestState extends State<Test> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Test"),
),
body: new ListView.builder(
// itemCount: myData.lenght(),
itemCount: 20,
itemBuilder: (BuildContext context, int index) {
//sort my data by timestamp before building
return new CustomWidget(date: "Convert my time stamp to date",
content: "My Awesome Content",
trailingIconOne: new Icon(Icons.share, color: Colors.blueAccent,),
trailingIconTwo: new Icon(
Icons.favorite, color: Colors.redAccent,),);
}),
);
}
}
class CustomWidget extends StatelessWidget {
String date;
String content;
Icon trailingIconOne;
Icon trailingIconTwo;
CustomWidget(
{@required this.date, @required this.content, @required this.trailingIconOne, @required this.trailingIconTwo});
@override
Widget build(BuildContext context) {
return new Container(
decoration: new BoxDecoration(
border: new Border.all(color: Colors.grey[500])
),
child: new Column(
children: <Widget>[
new Container (child: new Text(date), color: Colors.yellow[200],),
new Container(height: 15.0,),
new Text(content),
new Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
new IconButton(icon: trailingIconOne, onPressed:() {}),
new Container(width: 10.0,),
new IconButton(icon: trailingIconTwo, onPressed:() {})
],
)
],
),
);
}
}
对于更好的设计,你可以摆脱边框并使用Divider
来代替:
return new Container(
child: new Column(
children: <Widget>[
new Column (children: <Widget>[
new Container (child: new Text(date), color: Colors.yellow[200],),
new Container(height: 15.0,),
new Text(content),
new Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
new IconButton(icon: trailingIconOne, onPressed:() {}),
new Container(width: 10.0,),
new IconButton(icon: trailingIconTwo, onPressed:() {}),
],),
new Divider(height: 15.0,color: Colors.red,),
],
)
],
),
而且在我看来,更好的视觉解决方案是使用一个Card
代替Container
,
return new Card(
child: new Column(
children: <Widget>[
new Column (children: <Widget>[
new Container (child: new Text(date), color: Colors.yellow[200],),
new Container(height: 15.0,),
new Text(content),
new Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
new IconButton(icon: trailingIconOne, onPressed:() {}),
new Container(width: 10.0,),
new IconButton(icon: trailingIconTwo, onPressed:() {}),
],),
// new Divider(height: 15.0,color: Colors.red,),
],
)
],
),
);
虽然这可能并不适用于您的情况,一个简单的方法来分隔添加到ListView是使用ListView.divideTiles
:
// Adapted from https://flutter.io/flutter-for-android/#listviews--adapters
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new ListExamplePage(),
);
}
}
class ListExamplePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// https://docs.flutter.io/flutter/material/ListTile/divideTiles.html
var dividedWidgetList = ListTile.divideTiles(
context: context,
tiles: _getListData(),
color: Colors.black).toList();
return new Scaffold(
appBar: new AppBar(
title: new Text('List Example'),
),
body: new ListView(children: dividedWidgetList)
);
}
_getListData() {
List<Widget> widgets = [];
for (int i=0; i<100; i++) {
widgets.add(
new Padding(
padding: new EdgeInsets.all(10.0),
child: new Text('Row $i'))
);
}
return widgets;
}
}
编辑:
对于动态生成列表,ListTile.divideTiles不是正确的选择。在其中列表项目建成阶段添加分隔可能是最好的一段路要走:
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new ListExamplePage(),
);
}
}
class ListExamplePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('List Example'),
),
body: new ListView.builder(
itemBuilder: (BuildContext context, int position) =>
// Try using either _getRowWithDivider or _getRowWithBoxDecoration
// for two different ways of rendering a divider
_getRowWithDivider(position),
));
}
/// Returns the widget at position i in the list, separated using a divider
Widget _getRowWithDivider(int i) {
var children = <Widget>[
new Padding(padding: new EdgeInsets.all(10.0), child: new Text('Row $i')),
new Divider(height: 5.0),
];
return new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: children,
);
}
// Returns the widget at position i in the list, separated using a BoxDecoration
Widget _getRowWithBoxDecoration(int i) {
return new Container(
decoration: new BoxDecoration(
border:
new Border(bottom: new BorderSide(color: Colors.grey[100]))),
child: new Padding(
padding: new EdgeInsets.all(10.0), child: new Text('Row $i')));
}
}
这看起来很有希望,如果我通过http调用得到我的消息列表,那么我将它放在一个列表中,现在我使用listview。生成器并为每个项目应用一个小部件,但是现在我需要一个按日期分割的日期,每个日期可以是1或多个。我现在正在尝试做一个列表视图,其中包含消息列表视图,但是与大小错误对等。您的解决方案看起来更直接,接受日期所需的分隔符而不是每个分隔符。任何建议都会很棒。 – Robert
对于动态列表,不幸的是ListTile.divideTiles不会为你工作。我建议使用aziza的建议,并在每行构建小部件时插入分隔符(或BoxDecoration)。我将更新一个不同的代码片段来演示。 –
简单地把ListItem
为Container
,并添加装饰:
@override
Widget build(BuildContext context) {
return new Container(
child: new ListTile(
title: new Text('I have border')
),
decoration:
new BoxDecoration(
border: new Border(
bottom: new BorderSide()
)
)
);
}
- 1. 解析列表与最小分隔符
- 2. 制表符分隔数组到numpy数组列表?
- 3. 分隔字符串与分隔符
- 4. SQL拆分制表符分隔列
- 5. 用分隔符分割列表
- 6. 颤动中的扩展面板列表
- 7. Howto分割泛型列表项与分隔符?
- 8. C#列表<string>与分隔符字符串
- 9. 颤动与JSON填充dropdownmenu
- 10. vb.net自动完成与分隔符
- 11. 拆分列分隔符R
- 12. GNU Make:如何加入列表并用分隔符分隔它?
- 13. 在Python中使用分隔符分隔列表
- 14. 数组项的逗号分隔列表
- 15. 击:分割(多)字符串到数组与multichar分隔符
- 16. 如何更改列表的分隔符?
- 17. 删除html表中的列分隔符
- 18. Flex平铺列表的行分隔符
- 19. 添加分隔符来拼接列表
- 20. sqoop中使用的分隔符列表
- 21. ASP多选列表框分隔符
- 22. SharePoint列表/ Excel来在分隔符
- 23. 逗号分隔字符串列表
- 24. 文件和路径列表分隔符:
- 25. C#:字符串拆分返回字符串列表和分隔符列表?
- 26. DecimalFormat没有分组分隔符字符
- 27. 从分隔列表
- 28. 从制表符分隔的文本文件列制作数组
- 29. 如何使用多个分隔符在数组列表
- 30. 基于列值组合制表符分隔文件
谢谢,我认为是足够让我从正确的方向开始。如果我一路卡住,我会发布一个新项目。 – Robert
不要那样做!使用'new Divider()'而不是灰色边框...... – Darky
无论如何,我并不打算展示一个伟大的设计,是的Divider更好,但只是在这个特定的布局中,它需要调整才能产生效果。我在最后添加了更改,如果我们使用Card而不是Container作为父级,那么这可能会是一个更好看的设计,但此示例仅用于表明您可以自定义自己的小部件。 – aziza