我正在尝试使用网络图像作为google_maps_flutter的标记。它一直向我显示默认的引脚保持器代替。
var markerbitmap;
getpicture() async {
String imgurl =
"http://domain/image.jpg";
Uint8List bytes = (await NetworkAssetBundle(Uri.parse(imgurl)).load(imgurl))
.buffer
.asUint8List();
setState(() {
markerbitmap = BitmapDescriptor.fromBytes(bytes);
});
}
@override
void initState() {
getpicture();
}
_addMarker(LatLng position, String id, BitmapDescriptor descriptor) {
MarkerId markerId = MarkerId(id);
Marker marker =
Marker(markerId: markerId, icon: descriptor, position: position);
_markers[markerId] = marker;
}
void _onMapCreated(GoogleMapController controller) {
mapController = controller;
LatLng latLng_1 = LatLng(startCoordinatesLat, startCoordinatesLng);
LatLng latLng_2 = LatLng(endCoordinatesLat, endCoordinatesLng);
_markers.clear();
_addMarker(
latLng_1,
"origin",
markerbitmap ?? BitmapDescriptor.defaultMarker,
);
_addMarker(
latLng_2,
"destination",
markerbitmap ?? BitmapDescriptor.defaultMarker,
);
_addMarker(
LatLng(31.5096673920523, 74.37318230126559),
"waypoint",
markerbitmap ?? BitmapDescriptor.defaultMarker,
);
setState(() {
});
}
GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: _kGooglePlex,
mapType: MapType.normal,
tiltGesturesEnabled: true,
compassEnabled: true,
scrollGesturesEnabled: true,
zoomGesturesEnabled: true,
polylines: Set < Polyline >.of(_polylines.values),
markers: Set < Marker >.of(_markers.values),
onCameraMove: _onCameraMove,
myLocationButtonEnabled: false,
)
1条答案
按热度按时间pcww981p1#
我认为这里的问题是
getpicture()
是一个异步函数,您在initState
中调用它,但是您创建GoogleMap
小部件的build
方法将在这个future完成之前运行**。即使您在
getpicture()
获取网络映像之后调用setState
,GoogleMap
小部件也不会重新构建,因为在构建小部件时没有直接使用变量markerbitmap
:它只在_onMapCreated
函数中使用,该函数在创建GoogleMap
后运行。这就是发生的事情:
initState
已调用getpicture
开始1.调用
build
方法1.构建
GoogleMap
小工具_onMapCreated
被调用markerbitmap
仍为空,因此使用默认标记1....(异步间隙)
1.在一段时间之后,
getpicture
结束并且markerbitmap
被设置,但是小部件已经被构建。我会尝试使用
FutureBuilder
来获取网络映像,并仅在完成后构建GoogleMap
。将
getpicture
转换为未来功能:为将来创建一个状态类成员,并在
initState
中为其赋值:在
FutureBuilder
中使用future函数: