Используйте блок мультифлаттера на одной странице

Я пытаюсь изучить и использовать блок флаттера в другом, чтобы создать проект, который прослушивает местоположение пользователя, а также получает некоторые координаты от службы и показывает эти координаты на карте в качестве маркера. Итак, это метод myApp:

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 страница показывает карту:

 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']),
        ],
      );
    });
  }

Я сбит с толку, потому что не знаю, как я могу использовать FoursquareBloc, чтобы получить координаты для отображения в качестве маркера на карте?

Это 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);
    }

  }

а это 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());
      }
    }
  }
}

Он снова вызывает BlocBuilder в BlocBuilder<LocationBloc, LocationState>(builder: (context, state) или мне нужно вызывать FoursquareBlo внутри LocationBloc с помощью конструктора LocationBloc?


person Cyrus the Great    schedule 15.04.2020    source источник
comment
вы хотите, чтобы виджет HomeFoursquareScreen реагировал на оба блока?   -  person Payam Zahedi    schedule 15.04.2020
comment
Да. В HomeFoursquareScreen я хочу отображать местоположение пользователя из locationBloc и координаты из FoursquareBloc @PayamZahedi   -  person Cyrus the Great    schedule 15.04.2020


Ответы (1)


У меня была такая же проблема, и до сих пор библиотека Flutter Bloc не поддерживает MultiBlocBuilder. вы можете использовать построитель вложенных блоков или Создать новый блок, который объединяет состояния двух других. Я делаю проблему в Github, чтобы получить дополнительную информацию.

person Payam Zahedi    schedule 15.04.2020