Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Sugestão] Possível solução para o desafio

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;
    });
  }

[...]

1 resposta
solução!

Olá, Cleiton, como vai?

Muito bacana sua solução para o desafio! Você utilizou uma abordagem bem estruturada para implementar a ordenação na leitura dos dados. Parabéns pelo trabalho! Sua solução está muito bem desenvolvida. Continue compartilhando suas ideias e evoluindo!

Siga firme nos seus estudos e conte com o fórum sempre que precisar!

Abraços :)