0
respostas

Gerencia de estado com Cubit

Olá, estou implementando uma funcionalidade no sistema utilizando o Cubit como gerencia de estado. No sistema tenho duas telas, na telaA o usuário visualiza uma lista de prestadores de serviços e pode "favoritar" determinado profissional clicando num IconButton que chama um método Cubit que por sua vez vai na API para adicionar esse profissional como favorito do cliente logado, e devolve para a telaA se ocorreu tudo certo ou se teve falha no processo, até aqui está tudo correto. No método do Cubit o que eu faço é em caso de sucesso eu emito no construtor do State uma lista contendo os profissionais favoritos do usuário. Na telaB eu tenho uma listViewBuilder que consume BlocConsumer esse State, entretanto a lista sempre fica em branco, mesmo contendo itens favoritados, abaixo vou colocar os códigos

TelaA:

GestureDetector(
  onTap: () async {
    /// Chamamdo o método para favoritar ou não o profissional
    final _clienteCubit = context.read<ClientCubit>();
    final _result = await _clienteCubit.favoritarDesfavoritarProfissional(
      clienteID: _clienteCubit.clientModel.id,
      profissionalID: widget.professional.id,
      favoritar: !favorito, #favorito é um bool
    );
    if (_result == true) {
      setState(() {
        favorito = !favorito;
      });
    }
  },
  child: favorito
      ? Icon(
          Icons.favorite,
          color: Color(0xff8A8AD3),
          size: Util.getProportionScreenWidth(
            context,
            0.055,
          ),
        )
      : Icon(
          Icons.favorite_border,
          color: Color(0xff8A8AD3),
          size: Util.getProportionScreenWidth(
            context,
            0.055,
          ),
        ),
),

TelaB:

import ...

class FavoritePage extends StatefulWidget {
  @override
  _FavoritePageState createState() => _FavoritePageState();
}

class _FavoritePageState extends State<FavoritePage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.only(top: heightAppBarPage),
      child: Scaffold(
        body: _buildBody(),
        backgroundColor: customBodyBackgroundColor,
      ),
    );
  }

  _buildBody() {
    return SingleChildScrollView(
      child: Column(
        ...
            child: _buildList(context),
          ),
        ],
      ),
    );
  }

/// Método que consume o ClientCubit/ClientState 
/// que contem a lista de profissionais favoritados
  _buildList(BuildContext context) {
    return BlocConsumer<ClientCubit, ClientState>(
      listener: (context, state) {
        if (state is ClientErrorState) {}
        if (state is ClientSuccessState) {}
      },
      builder: (context, state) {
        if (state is ClientProcessState) {...}
        if (state is ClientSuccessState) {...}
          /// SEMPRE CAI AQUI
          if (state.professionalList.length == 0) {
            return customEmptyData();
          }
          if (state.professionalList.length > 0) {
            return ListView.builder(
             ...
              itemCount: state.professionalList.length,
              itemBuilder: (context, index) {
                final pModel = state.professionalList[index];
                ...
              },
            );
          }
        }
        return Container();
      },
    );
  }
}

Cubit:

class ClientCubit extends Cubit<ClientState> {
  ClientService _service;
  ClienteData _data;
  ClientModel clientModel;
  List<ClientModel> clientList;
  List<ProfessionalModel> listaProfissionalFavorito;

  ClientCubit() : super(ClientInitial()) {
    _service = ClientService();
  } 
... 
Future<bool> favoritarDesfavoritarProfissional({
    String clienteID,
    String profissionalID,
    bool favoritar = true,
    ProfessionalModel profissional,
  }) async {
    try {
      final resultService = await _service...;
      if (resultService == true) {
        ...
        emit(
          ClientSuccessState(
            ...
            professionalList: [...listaProfissionalFavorito],
          ),
        );
      }
      return resultService;
    } catch (e) {return false;}
  }

State:

part of 'cubit.dart';
abstract class ClientState extends Equatable {const ClientState();}

class ClientInitial extends ClientState {
  @override
  List<Object> get props => [];
}

class ClientProcessState extends ClientState {
  @override
  List<Object> get props => [];
}

class ClientSuccessState extends ClientState {
  final String successMessage;
  final ClientModel clientModel;
  final List<ClientModel> clientList;
  final List<ProfessionalModel> professionalList;
  ClientSuccessState({
    this.successMessage,
    this.clientModel,
    this.clientList,
    this.professionalList,
  });

  @override
  List<Object> get props => [];
}

class ClientErrorState extends ClientState {
  final String error;
  ClientErrorState(this.error);
  @override
  List<Object> get props => [error];
}

Gostaria de saber o que está faltando fazer?