Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Params #9

Open
maltsavkiryl opened this issue Oct 24, 2019 · 1 comment
Open

Params #9

maltsavkiryl opened this issue Oct 24, 2019 · 1 comment

Comments

@maltsavkiryl
Copy link

maltsavkiryl commented Oct 24, 2019

Hey ResoCoder!

I am currently working on a flutter project, and have applied your architecture. It was hard in the beginning, but atm I have a pretty good understanding of it! I have one struggle though.

When working on the [feature]_bloc file, where everything comes together. I get an error when importing/injecting multiple usecases that there are multiple imports that have a "Params" class. VSCode suggests using prefixes to seperate them. I this the right solution or is there a better/less code solution?

this is my solution.

import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:dartz/dartz.dart';
import 'package:njoy_shopping_app/constants/error_constants.dart';
import 'package:njoy_shopping_app/core/error/failures.dart';
import 'package:njoy_shopping_app/features/merchants/data/models/merchant_model.dart';
import 'package:njoy_shopping_app/features/merchants/domain/usecases/get_merchant_by_id.dart'
    as _merchantById;
import 'package:njoy_shopping_app/features/merchants/domain/usecases/get_merchants.dart'
    as _merchants;
import 'package:njoy_shopping_app/features/merchants/domain/usecases/get_merchants_by_name.dart'
    as _merchantByName;
import './bloc.dart';
import 'package:meta/meta.dart';

class MerchantBloc extends Bloc<MerchantEvent, MerchantState> {
  final _merchantById.GetMerchantById getMerchantById;
  final _merchantByName.GetMerchantsByName getMerchantsByName;
  final _merchants.GetMerchants getMerchants;

  MerchantBloc({
    @required _merchantById.GetMerchantById getMerchantById,
    @required _merchantByName.GetMerchantsByName getMerchantsByName,
    @required _merchants.GetMerchants getMerchants,
  })  : assert(getMerchantById != null),
        assert(getMerchantsByName != null),
        assert(getMerchants != null),
        getMerchantById = getMerchantById,
        getMerchantsByName = getMerchantsByName,
        getMerchants = getMerchants;

  @override
  MerchantState get initialState => InitialMerchantState();

  @override
  Stream<MerchantState> mapEventToState(
    MerchantEvent event,
  ) async* {
    if (event is SearchByMerchantNameEvent) {
      yield MerchantsLoading();

      final failureOrMerchants =
          await getMerchantsByName(_merchantByName.Params(name: event.name));

      yield* _eitherLoadedMerchantsOrErrorState(failureOrMerchants);
    } else if (event is SearchMerchantsEvent) {
      yield MerchantsLoading();

      final failureOrMerchants = await getMerchants(_merchants.Params(
        lat: event.lat,
        lng: event.lng,
        rad: event.rad,
        cat: event.cat,
      ));

      yield* _eitherLoadedMerchantsOrErrorState(failureOrMerchants);
    } else if (event is GetMerchantByIdEvent) {
      yield MerchantsLoading();

      final failureOrMerchant =
          await getMerchantById(_merchantById.Params(merchantId: event.id));

      yield* _eitherLoadedMerchantOrErrorState(failureOrMerchant);
    }
  }

  Stream<MerchantState> _eitherLoadedMerchantsOrErrorState(
    Either<Failure, List<MerchantModel>> failureOrMerchants,
  ) async* {
    yield failureOrMerchants.fold(
        (failure) => Error(message: _mapFailureToMessage(failure)),
        (merchants) => MerchantsLoaded(merchants: merchants));
  }

  Stream<MerchantState> _eitherLoadedMerchantOrErrorState(
    Either<Failure, MerchantModel> failureOrMerchants,
  ) async* {
    yield failureOrMerchants.fold(
        (failure) => Error(message: _mapFailureToMessage(failure)),
        (merchant) => MerchantLoaded(merchant: merchant));
  }

  String _mapFailureToMessage(Failure failure) {
    switch (failure.runtimeType) {
      case ServerFailure:
        return SERVER_FAILURE_MESSAGE;
      case CacheFailure:
        return CACHE_FAILURE_MESSAGE;
      default:
        return 'Unexpected error';
    }
  }
}

@donovanrost
Copy link

Do you just need to avoid a namespace collision?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants