Flutter: вывод данных из sqlite из категории и подкатегории
База данных подключена. Все работает, но я не понимаю как заставить выводить данные по щелчку категории:
import 'package:flutter/material.dart';
import 'package:flutterapp/article.dart';
import '../database_provider.dart';
class HomeTab extends StatefulWidget {
final DatabaseProvider databaseProvider;
HomeTab({this.databaseProvider});
@override
State<StatefulWidget> createState() {
return HomeTabState();
}
}
class HomeTabState extends State<HomeTab> {
List<MyTile> tiles = [];
@override
void initState() {
super.initState();
Future.wait([
widget.databaseProvider.getMeetingGamesMl(),
widget.databaseProvider.getMeetingGamesSr(),
widget.databaseProvider.getMeetingGamesSt(),
widget.databaseProvider.getSplochenieGamesMl(),
widget.databaseProvider.getSplochenieGamesSr(),
widget.databaseProvider.getSplochenieGamesSt(),
widget.databaseProvider.getDoverieGamesMl(),
widget.databaseProvider.getDoverieGamesSr(),
widget.databaseProvider.getDoverieGamesSt(),
widget.databaseProvider.getLiderGamesMl(),
widget.databaseProvider.getLiderGamesSr(),
widget.databaseProvider.getLiderGamesSr(),
widget.databaseProvider.igriNaVzaimodeistvie(),
widget.databaseProvider.igriNaVoobrazenie(),
widget.databaseProvider.igriVPomeshenii(),
widget.databaseProvider.igriDlyStanchii(),
widget.databaseProvider.igriPytiminutki(),
widget.databaseProvider.igriVAvtobuse(),
widget.databaseProvider.podviznieIgri(),
widget.databaseProvider.igriRozigrishi(),
widget.databaseProvider.igrodiskoteka(),
widget.databaseProvider.igriKonkursi(),
widget.databaseProvider.igriSBall(),
widget.databaseProvider.igriSZalom(),
widget.databaseProvider.igriVVode(),
widget.databaseProvider.danetki()
]).then((v) => _fillTiles(v));
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: ListView.builder(
itemBuilder: (BuildContext context, int index) {
return StuffInTiles(tiles[index]);
},
itemCount: tiles.length,
),
),
);
}
void _fillTiles(List<List<Article>> articlesList) {
var index = 0;
tiles = [
MyTile(
'ИГРЫ НА ЗНАКОМСТВА',
children: [
MyTile('Младший | 7-10 лет', articles: articlesList[index++]),
MyTile('Средний | 10 - 12 лет', articles: articlesList[index++]),
MyTile('Старший | 13-16 лет', articles: articlesList[index++]),
],
),
new MyTile(
'ИГРЫ НА СПЛОЧЕНИЕ',
children: <MyTile>[
new MyTile('Младший | 7-10 лет', articles: articlesList[index++]),
new MyTile('Средний | 10 - 12 лет', articles: articlesList[index++]),
new MyTile('Старший | 13-16 лет', articles: articlesList[index++]),
],
),
new MyTile(
'ИГРЫ НА ДОВЕРИЕ',
children: <MyTile>[
new MyTile('Младший', articles: articlesList[index++]),
new MyTile('Средний', articles: articlesList[index++]),
new MyTile('Старший', articles: articlesList[index++]),
],
),
new MyTile(
'ИГРЫ НА ВЫЯВЛЕНИЕ ЛИДЕРА',
children: <MyTile>[
new MyTile('Младший | 7-10 лет', articles: articlesList[index++]),
new MyTile('Средний | 10 - 12 лет', articles: articlesList[index++]),
new MyTile('Старший | 13-16 лет', articles: articlesList[index++]),
],
),
new MyTile('ИГРЫ НА ВЗАИМОДЕЙСТВИЕ', articles: articlesList[index++]),
new MyTile('ИГРЫ НА ВООБРАЖЕНИЕ', articles: articlesList[index++]),
new MyTile('ИГРЫ В ПОМЕЩЕНИИ', articles: articlesList[index++]),
new MyTile('ИГРЫ ДЛЯ СТАНЦИИ', articles: articlesList[index++]),
new MyTile('ИГРЫ ПЯТИМУТКИ', articles: articlesList[index++]),
new MyTile('ИГРЫ В АВТОБУСЕ', articles: articlesList[index++]),
new MyTile('ПОДВИЖНЫЕ ИГРЫ', articles: articlesList[index++]),
new MyTile('ИГРЫ-РОЗЫГРЫШИ', articles: articlesList[index++]),
new MyTile('ИГРОДИСКОТЕКА', articles: articlesList[index++]),
new MyTile('ИГРЫ-КОНКУРСЫ', articles: articlesList[index++]),
new MyTile('ИГРЫ С МЯЧОМ', articles: articlesList[index++]),
new MyTile('ИГРЫ С ЗАЛОМ', articles: articlesList[index++]),
new MyTile('ИГРЫ В ВОДЕ', articles: articlesList[index++]),
new MyTile('ДАНЕТКИ', articles: articlesList[index++]),
];
setState(() {});
}
}
class StuffInTiles extends StatelessWidget {
final MyTile myTile;
StuffInTiles(this.myTile);
@override
Widget build(BuildContext context) {
return buildTiles(myTile);
}
Widget buildTiles(MyTile v) {
if (v.children.isEmpty)
return new ListTile(
dense: true,
enabled: true,
isThreeLine: false,
onLongPress: () => print("long press"),
onTap: () => print("tap"),
selected: false,
trailing: new Text("+"),
title: new Text(v.title));
return new ExpansionTile(
key: new PageStorageKey<int>(3),
title: new Text(v.title),
children: v.children.map(buildTiles).toList(),
);
}
}
class MyTile {
String title;
List<Article> articles;
List<MyTile> children;
MyTile(this.title, {this.children = const <MyTile>[], this.articles});
}
List<MyTile> listOfTiles = <MyTile>[
new MyTile(
'ИГРЫ НА ЗНАКОМСТВА',
children: <MyTile>[
new MyTile('Младший | 7-10 лет'),
new MyTile('Средний | 10 - 12 лет'),
new MyTile('Старший | 13-16 лет'),
],
),
new MyTile(
'ИГРЫ НА СПЛОЧЕНИЕ',
children: <MyTile>[
new MyTile('Младший | 7-10 лет'),
new MyTile('Средний | 10 - 12 лет'),
new MyTile('Старший | 13-16 лет'),
],
),
new MyTile(
'ИГРЫ НА ДОВЕРИЕ',
children: <MyTile>[
new MyTile('Младший | 7-10 лет'),
new MyTile('Средний | 10 - 12 лет'),
new MyTile('Старший | 13-16 лет'),
],
),
new MyTile(
'ИГРЫ НА ВЫЯВЛЕНИЕ ЛИДЕРА',
children: <MyTile>[
new MyTile('Младший | 7-10 лет'),
new MyTile('Средний | 10 - 12 лет'),
new MyTile('Старший | 13-16 лет'),
],
),
new MyTile(
'ИГРЫ НА ВЗАИМОДЕЙСТВИЕ',
),
new MyTile(
'ИГРЫ НА ВООБРАЖЕНИЕ',
),
new MyTile(
'ИГРЫ В ПОМЕЩЕНИИ',
),
new MyTile(
'ИГРЫ ДЛЯ СТАНЦИИ',
),
new MyTile(
'ИГРЫ ПЯТИМИНУТКИ',
),
new MyTile(
'ИГРЫ В АВТОБУСЕ',
),
new MyTile(
'ПОДВИЖНЫЕ ИГРЫ',
),
new MyTile(
'ИГРЫ-РОЗЫГРЫШИ',
),
new MyTile(
'ИГРОДИСКОТЕКА',
),
new MyTile(
'ИГРЫ-КОНКУРСЫ',
),
new MyTile(
'ИГРЫ С МЯЧОМ',
),
new MyTile(
'ИГРЫ С ЗАЛОМ',
),
new MyTile(
'ИГРЫ В ВОДЕ',
),
new MyTile(
'ДАНЕТКИ',
),
];
Понимаю, что дело в этом, но как отредактировать код, чтобы при нажатии выходила активити с категорией?
Widget buildTiles(MyTile v) {
if (v.children.isEmpty)
return new ListTile(
dense: true,
enabled: true,
isThreeLine: false,
onLongPress: () => print("long press"),
onTap: () => print("tap"),
selected: false,
trailing: new Text("+"),
title: new Text(v.title));
Вот скрипт, который реализует аналогичное напрямую:
import 'package:flutter/material.dart';
import 'package:flutterapp/article.dart';
import '../database_provider.dart';
class FireTab extends StatefulWidget {
final DatabaseProvider databaseProvider;
FireTab({this.databaseProvider});
@override
State<StatefulWidget> createState() {
return FireTabState();
}
}
class FireTabState extends State<FireTab> {
List<Article> articles = [];
@override
void initState() {
super.initState();
widget.databaseProvider
.getLiderGamesSr()
.then((articles) => _onArticlesLoaded(articles));
}
void _onArticlesLoaded(List<Article> articles) {
setState(() {
this.articles = articles;
});
}
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: articles.length,
itemBuilder: (context, index) => ListTile(
title: Text(articles[index].title),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => Scaffold(
appBar:AppBar(
backgroundColor: Colors.deepOrangeAccent,
title: Text(articles[index].title)),
backgroundColor: Colors.white,
body: Text(articles[index].text),
)));
},
));
}
}
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Надеюсь правильно понял:
onTap: () => Navigator.of(context).push(MaterialPageRoute(builder: (context) => DescriptionScreen(v))),
class DescriptionScreen extends StatelessWidget {
final MyTile myTile;
DescriptionScreen(this.myTile);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(myTile.title),
),
body: Container(child: ListView.builder(
itemCount: myTile.children.length,
itemBuilder: (BuildContext context, int index) {
return Column(children: [Text(myTile.articles[index]...)]);
},
))
);
}
}