我正在使用BLoC模式和flutter_map包构建一个flutter应用程序。我想将相机移动到特定位置。我试图将Map控制器传递到我的块结构并从那里移动相机,但我得到一个错误:
第一个月
我不确定这是不是正确的方法。
class HomePage extends StatelessWidget {
const HomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
...,
BlocProvider<MapBloc>(
create: (BuildContext context) => MapBloc(mapController: MapController()) // passing map controller
..add(MapDataInit()),
)
],
...
);
}
}
字符串
map_bloc.dart
class MapBloc extends Bloc<MapEvent, MapState> {
final MapController mapController;
LocationRepository _locationRepository = LocationRepository();
MapBloc({@required this.mapController});
@override
get initialState => MapDataUninitialized();
@override
Stream<MapState> mapEventToState(MapEvent event) async* {
final currentState = state;
if (event is AddMarker) {
yield MapDataLoaded(
mapController: this.mapController,
markers: [...]);
this.add(MoveCamera(event.latLan)); // not sure about this
}
if (event is MoveCamera) {
mapController.onReady.then((result) { // i'm getting an error here
mapController.move(event.latLan, 15.0);
});
}
}
}
型
带有Map的Widget
class SelectLocationView extends StatelessWidget {
Widget build(BuildContext context) {
return BlocBuilder<MapBloc, MapState>(
builder: (context, state) {
...
if (state is MapDataLoaded) {
return Container(
child: Center(
child: Container(
child: FlutterMap(
mapController: state.mapController, // I'm trying to get previously defined controller
options: MapOptions(...),
layers: [
TileLayerOptions(
urlTemplate:
"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
subdomains: ['a', 'b', 'c']),
MarkerLayerOptions(...),
],
))),
);
}
},
);
}
}
型
我不知道为什么Map控制器的onReady方法有问题。
5条答案
按热度按时间bmp9r5qi1#
我在使用GetX时遇到了类似的问题。
我决定通过应用一些前提:首先,我在Widget(无状态)中保留了Map的任何和所有操作 ,因为我需要在google插件和flutter_map 之间切换。
然后,在控制器中(在BloC中的情况下),它只是触发必要的信息,以便视图从它那里接收必须居中的新位置,但视图是知道和集中Map的人,而不是BloC。
简而言之,我必须使用静态变量来保持应用程序中mapController的单例引用,因为“onReady()”方法只被调用一次,所以我保留了bool来控制map的状态,而“onReady“方法没有执行,我们无法访问map对象,如”zoom“和”move“。
我的示例代码:
字符串
oalqel3c2#
听起来很傻,但是你正在初始化Map控制器吗?
ovfsdjhp3#
如果你使用BLoC(作为状态管理),这里有一个例子,你可以在没有
controller
的情况下完成它。1.把你的
FlutterMap
小工具放在你的自定义小工具里。1.在调用这个小部件时,使用
key
并使用BlocBuilder Package 它。结果,FlutterMap
小部件将重新构建新的中心。范例:
字符串
来源:GitHub
wsxa1bj14#
上面的答案是正确的,但我会补充一件事,这对我来说也是一个大问题。如何根据用户缩放保持缩放级别因为当你监听当前位置的变化并根据它更新相机位置时,缩放级别也会选择你在开始时提供的缩放级别。
首先听一下位置流:
字符串
jdg4fx2g5#
你也可以用BLOC来实现,只要使用一个
BlocListener
并根据你的状态更新Controller值,无论何时状态改变字符串