【发布时间】:2019-10-07 10:23:28
【问题描述】:
所以我试图通过检索用户位置并向接收器添加标记来使用 StreamBuilder 更改我的地图状态。这是我的 BLoC 课程:
class CustomMapBLoC {
StreamController customMapStreamController = StreamController<Marker>.broadcast();
Sink get customMapSink => customMapStreamController.sink;
Stream<Marker> get customMapStream => customMapStreamController.stream;
createMarker(MarkerId markerId, Position position) {
Marker marker = Marker(
icon: BitmapDescriptor.defaultMarker,
markerId: markerId,
position: LatLng(position.latitude,position.longitude),
);
customMapSink.add(marker);
}
}
这是我的 StreamBuilder:
StreamBuilder(
stream: _customMapBLoC.customMapStream,
builder: (context,snapshot) {
if(snapshot.data != null) {
_customMap.markersMap[_userPositionId] = snapshot.data;
debugPrint("SNAPSHOT DATA: ${snapshot.data}"); // These two show the data is received in the console.
debugPrint("MARKERSMAP: ${_customMap.markersMap}");
}
return _customMap; //_customMap is created inside the build method
},
),
这就是我调用 createMarker 方法的地方:
FloatingActionButton(
onPressed: () {
_getPositionSubscription = geolocator.getPositionStream().listen((Position currentLocation) {
_customMapBLoC.createMarker(_userPositionId, currentLocation);
});
},
)
这就是我在 _customMap 类中传递我正在更改的标记图的方式:
static Map<MarkerId, Marker> _markersMap = <MarkerId, Marker>{};
CustomMap(): super(
mapType: defaultMapType,
initialCameraPosition: defaultCameraPosition,
onMapCreated: (GoogleMapController controller) {
_mapControllerCompleter.complete(controller);
},
markers: Set<Marker>.of(_markersMap.values),
);
为什么这不起作用?我做错了什么?
使用 Firebase 流的这段代码似乎可以正常工作,而我自己的流却不行。
StreamBuilder(
stream: Firestore.instance.collection("users").where("type",isEqualTo: 2).snapshots(),
builder: (context, snapshot) {
if(snapshot.data.documents.length > 0) {
debugPrint("MARKERS: ${_customMap.markersMap}");
for(var i = 0; i < snapshot.data.documents.length; i++) {
MarkerId markerId = MarkerId(snapshot.data.documents[i]['uid']);
Marker marker = new Marker(
icon: BitmapDescriptor.defaultMarker,
markerId: markerId ,
position: LatLng(34.040501,-4.9898821),
);
_customMap.markersMap[markerId] = marker;
}
}
return _customMap;
},
)
编辑:这是完整的构建方法代码:
@override
Widget build(BuildContext context) {
CustomMap _customMap = CustomMap();
_customMapBLoC = new CustomMapBLoC();
return Scaffold(
key: scaffoldKey,
appBar: AppBarLayout(context,"Home",scaffoldKey) ,
drawer: DrawerLayout(),
backgroundColor: Colors.grey.shade200,
body: Stack(
children: <Widget>[
StreamBuilder(
stream: _customMapBLoC.customMapStream,
builder: (context,snapshot) {
if(snapshot.data != null) {
_customMap.markersMap[_userPositionId] = snapshot.data as Marker;
debugPrint("SNAPSHOT DATA: ${snapshot.data}");
debugPrint("MARKERSMAP: ${_customMap.markersMap}");
}
return _customMap;
},
),
Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Container(
alignment: Alignment(1.0, 1.0),
child: SizedBox(
height: 35,
child: FloatingActionButton(
onPressed: () {
_getPositionSubscription = geolocator.getPositionStream().listen((Position currentLocation) {
_customMapBLoC.createMarker(_userPositionId, currentLocation);
});
},
child: Icon(
Icons.location_off,
size: 16,
),
backgroundColor: Color(0xffF2AB64),
)
),
),
Padding(
padding: EdgeInsets.only(top: 14.0),
),
],
)
],
),
);
}
【问题讨论】:
-
您的代码中没有
addMarker方法 -
@pskink 只是一个错字,它是 createMarker
-
有没有调用
_customMapBLoC.createMarker?尝试添加一些print('createMarker called')并检查日志? -
@pskink 是的,它被称为。在我的
StreamBuilder中,我有一个debugPrint来查看我是否收到任何数据。它打印在控制台中,但地图似乎没有更新。 -
那么什么不起作用?你按
FloatingActionButton然后createMarker被调用,最后StreamBuilder被重建(它的builder: (context, snapshot)被调用) - 那么它有什么问题?snapshot是错误的还是什么?
标签: flutter