Inicialmente modifiquei a AppBar()
, adicionando o campo actions[]
. Nele coloquei um PopupMenuButton()
(sugerido no desafio):
[...]
appBar: AppBar(
title: const Text("Minhas listas"),
actions: [
PopupMenuButton(
onSelected: (value) => refresh(orderBy: value),
itemBuilder: (BuildContext ctx) {
return const [
PopupMenuItem(
value: 'name',
child: Text(
"Ordenar por nome",
),
),
PopupMenuItem(
value: 'updateDate',
child: Text(
"Ordenar por data de alteração",
),
),
PopupMenuItem(
value: '',
child: Text(
"Ordenar por data de criação",
),
),
];
},
),
],
),
[...]
Infelizmente, o campo value
só aceita Strings
. Sei que o ideal seria utilizar enums
neste caso, mas para agilizar a resolução acabei deixando assim mesmo (se alguém tiver uma alternativa, por favor, fiquem a vontade).
Depois de adicionar o menu no AppBar()
, criei as funções que estavam faltando no AppDatabase
:
Future<List<Listin>> findAllOrderedByName() async {
List<ListinTableData> data = await (select(listinTable)
..orderBy([(listin) => OrderingTerm(expression: listin.name)]))
.get();
return data
.map(
(row) => Listin(
id: row.id.toString(),
name: row.name,
obs: row.obs,
dateCreate: row.dateCreate,
dateUpdate: row.dateUpdate,
),
)
.toList();
}
Future<List<Listin>> findAllOrderedByUpdateDate() async {
List<ListinTableData> data = await (select(listinTable)
..orderBy([(listin) => OrderingTerm.desc(listin.dateUpdate)]))
.get();
return data
.map(
(row) => Listin(
id: row.id.toString(),
name: row.name,
obs: row.obs,
dateCreate: row.dateCreate,
dateUpdate: row.dateUpdate,
),
)
.toList();
}
Por fim, modifiquei a função refresh()
do home_screen.dart
, adicionando um parâmetro opcional para ter o controle de qual filtro será utilizado:
[...]
refresh({String? orderBy}) async {
// Basta alimentar essa variável com Listins que, quando o método for
// chamado, a tela sera reconstruída com os itens.
List<Listin> listaListins = [];
orderBy == 'name'
? listaListins = await _appDatabase.findAllOrderedByName()
: orderBy == 'updateDate'
? listaListins = await _appDatabase.findAllOrderedByUpdateDate()
: listaListins = await _appDatabase.findAll();
setState(() {
listListins = listaListins;
});
}
[...]