谷歌地图上的标记没有显示,只是在我在Flutter上重新启动Hot之后



我被困在这里,我有这个代码。但是我的记号笔没有出现!在地图上。只有当我进行热重启时。我使用RepaintBoundary来获得我想要的标记中的图像

Widget _buildMarkerIcon() {
return RepaintBoundary(
key: _markerIconKey,
child: Material(
shape: CircleBorder(),
clipBehavior: Clip.hardEdge,
child: Image(
image: AssetImage('imagenes/Junior_logo.png'),
fit: BoxFit.contain,
width: 40,
height: 40,
),
),
);
}

我的构建方法是这样的:

@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Stack(
children: [
Opacity(
opacity: _opacity_num,
child: _buildMarkerIcon()),
Opacity(
opacity: 1,
child: _buildBody()),
],
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.zoom_out_map),
onPressed: _centerView,
),
);
}
class _RegistroCuatroPageState extends State<RegistroCuatroPage> with AfterLayoutMixin<RegistroCuatroPage>{
GoogleMapController _mapController;
final _text = TextEditingController();

BitmapDescriptor icon;
double _opacity_num = 1;
Set<Marker> _markers = Set();
GlobalKey _markerIconKey;
Set<String> renderedMarkers = Set();

@override
void afterFirstLayout(BuildContext context) {
// Calling the same function "after layout" to resolve the issue.
//_addMarker();
//_asyncMethod();
}
@override
void initState() {
_markerIconKey = GlobalKey();
setState(() {
});
super.initState();
}

void _addMarker() async {
WidgetsBinding.instance.addPostFrameCallback((_) async
{
var markerBytes = await _getMarkerIconBytes(_markerIconKey);
_markers.add(Marker(
markerId: MarkerId(IdTacosSauces),
position: Constants.kTacosLocationSauces,
icon: BitmapDescriptor.fromBytes(markerBytes)));
setState(() {});
}
);
}
Future<Uint8List> _getMarkerIconBytes(GlobalKey markerKey) async {
if (markerKey.currentContext == null) return null;
RenderRepaintBoundary boundary =
markerKey.currentContext.findRenderObject();
var image = await boundary.toImage(pixelRatio: 2.0);
ByteData byteData = await image.toByteData(format: ImageByteFormat.png);
return byteData.buffer.asUint8List();
}

我关于谷歌地图的小部件是这样的:

Widget _buildBody() {
return  GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition:
CameraPosition(target: Constants.kTacosLocationSauces, zoom: 15),
markers: _markers,
),
),
);
}
void _onMapCreated(GoogleMapController controller) {
setState(() {
_opacity_num = 0;
});
_mapController = controller;
_addMarker();
_centerView();
}
_centerView() async {
await _mapController.getVisibleRegion();
var cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50);
_mapController.animateCamera(cameraUpdate);
}
}

我也尝试在_onMpCreated回调中添加标记,但没有添加。

嗯,问题似乎出在RenderRepaintBoundary.toImage((上。这里有一个问题,解释发生了什么。

这个解决方案对我有效:

Future<Uint8List> _getMarkerIconBytes(GlobalKey markerKey) async {
var image;
if (markerKey.currentContext == null) return null;
RenderRepaintBoundary boundary =
markerKey.currentContext.findRenderObject();

try {
image = await boundary.toImage(pixelRatio: 2.0);
}catch(e){
if (boundary.debugNeedsPaint) {
await Future.delayed(const Duration(milliseconds: 20));
return _getMarkerIconBytes(markerKey);
}
}
ByteData byteData = await image.toByteData(format: ImageByteFormat.png);
return byteData.buffer.asUint8List();}

最新更新