Cyrus the Great
Cyrus the Great

Reputation: 5932

Use multi flutter bloc in one page

I am trying to learn and use flutter bloc in other to i created a project that listen to user location and also get some coordinates from service and show this coordinates in map as a marker. So this is myApp method:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: MultiBlocProvider(providers: [
        BlocProvider<FoursquareBloc>(create: (context) => sl<FoursquareBloc>()), //bloc page to get corrdinate
        BlocProvider<LocationBloc>(create: (context) => sl<LocationBloc>()), // bloc page to listen to change user location
      ], child: HomeFoursquareScreen()),
    );
  }
}

HomeFoursquareScreen page shows map:

 Widget build(BuildContext context) {
    return BlocBuilder<LocationBloc, LocationState>(builder: (context, state) {
      if (state is LocationLoadingState) {
        return Center(child: CircularProgressIndicator());
      } else if (state is LocationLoadedState) {
        print("LocationLoadedState");
        intMapCoordinate =
            LatLng(state.location.latitude, state.location.longitude);
      } else if (state is UserLocationListeningState) {
        _controller.move(
            LatLng(state.location.latitude, state.location.longitude), 15.0);
      }
      return FlutterMap(
        mapController: _controller,
        options: MapOptions(
          center: intMapCoordinate,
          zoom: 13.0,
        ),
        layers: [
          TileLayerOptions(
              urlTemplate: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
              subdomains: ['a', 'b', 'c']),
        ],
      );
    });
  }

I am confused because i don't know how could i use FoursquareBloc to get coordinates to showing as a marker in the map?

This is LocationBloc

class LocationBloc extends Bloc<LocationEvent, LocationState> {
  var location = Location();
  StreamSubscription<LocationData> _locationSubscription;
  LocationData currentLocation;
  @override
  LocationState get initialState => LocationLoadingState();

  @override
  Stream<LocationState> mapEventToState(
    LocationEvent event,
  ) async* {
    if (event is GetCurrentLocation) {
      yield* _mapToGetCurrentLocationState();
    } else if (event is StartListeningForLiveLocation) {
      yield* _mapToStartListeningUserLocation();
    }else if (event is AddLiveUserLocation) {
      yield UserLocationListeningState(event.location);
    }

  }

and this is FoursquareBloc:

class FoursquareBloc extends Bloc<FoursquareEvent, FoursquareState> {
  final FoursquareRepository repo;
  FoursquareBloc(this.repo);

  @override
  FoursquareState get initialState => Empty();

  @override
  Stream<FoursquareState> mapEventToState(
    FoursquareEvent event,
  ) async* {
    if (event is GetVenuesByUserEvent) {
      yield Loading();
      try {
        final result = await repo.getVenuesByUser(event.lat, event.lng);
        yield Loaded(result);
      } on Exception catch (e) {
        yield Error(e.toString());
      }
    }
  }
}

Does it again call BlocBuilder under BlocBuilder<LocationBloc, LocationState>(builder: (context, state) or i have to call FoursquareBlo inside LocationBloc by using LocationBloc constructor?

Upvotes: 1

Views: 2114

Answers (1)

Payam Zahedi
Payam Zahedi

Reputation: 855

I had same issue and until now Flutter Bloc library does not support MultiBlocBuilder. you can use nested bloc builder or Create a new bloc which combines states from the other two. I make an issue in Github check it for more information.

Upvotes: 3

Related Questions