Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida erro com Switch

Olá professor

Estou implementando Bloc na TransactionsList e ao fazer a View tentei trocar a sequência de IFs

builder: (context, state) {
          if (state is InitTransactionsListState ||
              state is LoadingTransactionsListState) {
            return const Progress();
          }
          if (state is LoadedTransactionsListState) {
            final List<Transaction> transactions = state.transactions;

por um Switch:

          builder: (context, state) {          
            switch (state.runtimeType) {
              case InitTransactionsListState:
              case LoadingTransactionsListState:
                return const Progress();
              case LoadedTransactionsListState:
                    final List<Transaction> transactions = state .transactions;                  

mas a propriedade transactions de state não é reconhecida. Qual pode ser o problema?

6 respostas

Bom dia José! Desculpe a demora.

Irmão, não sei se foi erro na hora de copiar mas aqui no seu código o

case LoadedTransactionsListState:
            final List<Transaction> transactions = state .transactions;   

Tem um espaço no state .transactions , talvez retirando esse espaço ele volte a funcionar: state.transactions

Outra coisa: No seu: case InitTransactionsListState: você não ta retornando o Progress(), isso pode te dar dor de cabeça mais tarde xD

Se mesmo assim seu problema não for resolvido, pode me mandar o código completo? Assim eu posso avaliar com carinho :)

Fico no aguardo!

Olá professor

O espaço foi erro na cópia. Eu parei de ver isto para terminar os outros cursos mas depois testo novamente. A impressão que ficava era que ele não conseguia diferenciar as classes do state.

No switch, pelo que saiba, ele continua no próximo case se eu não colocar um break ou return. Por isto deixei assim, para retornar o Progress em InitTransactionsListState e em LoadingTransactionsListState. Pode ser que no dart o swith funcione diferente

Obrigado

Eu consegui resolver o problema fazendo um cast no momento de usar o state. Colocando um print para ver o tipo notei que com o IF e com o SWITCH era retornado o tipo correto:

I/flutter ( 4104): state: LoadedTransactionsListState

Mas por algum motivo o pré-processador do Dart/Flutter identifica a classe como a classe mãe TransactionsListState) e não como a classe derivada (LoadedTransactionsListState):

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Meu código final:

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import 'transactions_list.dart';
import '../../components/components.dart';
import '../../http/web_clients/transaction_web_cliente.dart';
import '../../models/models.dart';

class TransactionsListView extends StatelessWidget {
  final TransactionWebClient webClient;
  const TransactionsListView({Key? key, required this.webClient})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Transactions'),
      ),
      body: BlocBuilder<TransactionsListCubit, TransactionsListState>(
        builder: (context, state) {
          switch (state.runtimeType) {
            case InitTransactionsListState:
            case LoadingTransactionsListState:
              return const Progress();
            case LoadedTransactionsListState:
              final List<Transaction> transactions =
                  (state as LoadedTransactionsListState).transactions;
              if (transactions.isNotEmpty) {
                return ListView.builder(
                  itemBuilder: (context, index) {
                    final Transaction transaction = transactions[index];
                    return Card(
                      child: ListTile(
                        leading: const Icon(Icons.monetization_on),
                        title: Text(
                          transaction.value.toString(),
                          style: const TextStyle(
                            fontSize: 24.0,
                            fontWeight: FontWeight.bold,
                          ),
                        ),
                        subtitle: Text(
                          transaction.contact.accountNumber.toString(),
                          style: const TextStyle(
                            fontSize: 16.0,
                          ),
                        ),
                      ),
                    );
                  },
                  itemCount: transactions.length,
                );
              }
              return const CenteredMessage(
                message: 'No transactions found',
                icon: Icons.warning,
              );

            default:
              // FatalErrorTransactionsListState
              return const CenteredMessage(message: 'Unknow Error');
          }
        },
      ),
    );
  }
}

Recebi um comentário no (github do Dart) e concordei com ele. No caso acima o ideal é usar IF pois a checagem de tipagem no switch seria bem complicada

solução!

Perfeito Jose! Você manejou muito bem sua duvida, adorei essa informação que vc achou sobre o runtimeType!

Continue assim e você vai longe!

Vou fechar o tópico okay?

pode fechar :-)