Вы можете использовать этот подход ...
Создать классы, которые будут представлять различные типы элементов (HeaderItem
, MessageItem
), затем сопоставить _list
со списком элементов(вам нужно иметь значения заголовка внутри вашего _list
! - например, вы можете сделать _list.insert(18, "Part 2:...")
) и, наконец, использовать ListView.builder
.
Полный пример:
import 'package:flutter/material.dart';
void main() {
final _list = List<String>.generate(100, (index) => "$index");
_list.insert(0, "Part 1:...");
_list.insert(18, "Part 2:...");
_list.insert(49, "Part 3:...");
final List<ListItem> items = _list.map((value) {
final index = _list.indexOf(value);
if ([0, 18, 49].contains(index)) {
return HeaderItem(value);
} else {
return MessageItem(value);
}
}).toList();
runApp(
MaterialApp(
home: App(items: items),
),
);
}
class App extends StatelessWidget {
final List<ListItem> items;
const App({Key key, this.items}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
if (item is HeaderItem) {
return Column(
children: <Widget>[
Text(
item.heading,
),
Divider(),
],
);
} else if (item is MessageItem) {
return ListTile(
leading: Text('$index'),
title: Text(
item.title,
style: TextStyle(fontSize: 18),
),
);
}
},
),
);
}
}
abstract class ListItem {}
class HeaderItem implements ListItem {
final String heading;
HeaderItem(this.heading);
}
class MessageItem implements ListItem {
final String title;
MessageItem(this.title);
}
Пример с флажками:
App
теперь StatefulWidget
, MessageItem
имеет checked
свойство.
import 'package:flutter/material.dart';
void main() {
final _list = List<String>.generate(100, (index) => "$index");
_list.insert(0, "Part 1:...");
_list.insert(18, "Part 2:...");
_list.insert(49, "Part 3:...");
final List<ListItem> items = _list.map((value) {
final index = _list.indexOf(value);
if ([0, 18, 49].contains(index)) {
return HeaderItem(value);
} else {
return MessageItem(value);
}
}).toList();
runApp(
MaterialApp(
home: App(items: items),
),
);
}
class App extends StatefulWidget {
final List<ListItem> items;
const App({Key key, this.items}) : super(key: key);
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: widget.items.length,
itemBuilder: (context, index) {
final item = widget.items[index];
if (item is HeaderItem) {
return Column(
children: <Widget>[
Text(
item.heading,
),
Divider(),
],
);
} else if (item is MessageItem) {
return ListTile(
leading: Text('$index'),
title: Text(
item.title,
style: TextStyle(fontSize: 18),
),
trailing: Checkbox(
value: item.checked,
onChanged: (value) {
setState(() {
item.checked = value;
});
},
),
);
}
},
),
);
}
}
abstract class ListItem {}
class HeaderItem implements ListItem {
final String heading;
HeaderItem(this.heading);
}
class MessageItem implements ListItem {
final String title;
bool checked = false;
MessageItem(this.title);
}