Flutter 颤振:在setState之后将小部件转换为图像不会显示更改

Flutter 颤振:在setState之后将小部件转换为图像不会显示更改,flutter,google-maps,dart,setstate,marker,Flutter,Google Maps,Dart,Setstate,Marker,我已经为一个问题挣扎了几天,我开始怀疑它是否有一个像样的解决方案 我有一个谷歌地图,我想在其中显示不同的自定义标记,每个标记都是用来自API调用的信息创建的 为了实现这一点,我使用了一个堆栈小部件,它在谷歌地图下面有一个重绘边界,所以它是隐藏的。此重新绘制边界具有图像和文本标签 Widget build(BuildContext context) { return new Scaffold( body: Stack( children: [ RepaintBoundary

我已经为一个问题挣扎了几天,我开始怀疑它是否有一个像样的解决方案

我有一个谷歌地图,我想在其中显示不同的自定义标记,每个标记都是用来自API调用的信息创建的

为了实现这一点,我使用了一个堆栈小部件,它在谷歌地图下面有一个重绘边界,所以它是隐藏的。此重新绘制边界具有图像和文本标签

Widget build(BuildContext context) {
return new Scaffold(
  body: Stack(
    children: [
      RepaintBoundary(
        key: iconKey,
        child:
        Stack(
            children: [
              markerIconButton,
              markerText,
            ]
        ),
      ),
      GoogleMap(
        mapType: MapType.normal,
        myLocationEnabled: true,
        myLocationButtonEnabled:true,
        onMapCreated: _onMapCreated,
        markers: Set<Marker>.of(_markers),
      ),
    ]
  ),
),
问题是,当我调用使用RenderPaintBoundary.toImage方法的“getCustomIcon”时,新的文本和图像尚未渲染,因此作为图标传递给当前迭代标记的图像通常属于上一个迭代。有没有办法运行将小部件转换为图像的代码,以确保图像和文本中的更改已被呈现

我尝试首先生成循环中的所有图像,并使用WidgetsBinding.instance.addPostFrameCallback将它们保存在列表中,但当我从循环中删除用于添加每个标记的代码时,会跳过许多帧,并且只呈现上一次迭代的图像和文本


提前感谢。

在转换为图像之前,您没有时间让框架构建您的UI。setState是异步的,在框架有时间执行时执行。尝试添加延迟:

 setState((){
    markerIconButton = new Image.asset(backgroundImage);
    markerText = new Text(markerText);
  });
  Future.delayed(Duration(milliseconds: 2000));
  // Convert the widget to image
  BitmapDescriptor testIcon = await getCustomIcon(iconKey);

在转换为图像之前,您没有时间让框架构建UI。setState是异步的,在框架有时间执行时执行。尝试添加延迟:setState((){markerIconButton=new Image.asset(backgroundImage);markerText=new Text(markerText);});Future.delayed(持续时间(毫秒:2000));//将小部件转换为图像位图描述符testIcon=await getCustomIcon(iconKey);我已经测试过了,它是有效的,但是它对性能有巨大的影响,想象一下你有30个标记要显示。除此之外,无论您在延迟中指定了多少时间,您都无法100%保证已提交。我想应该有一种方法在渲染后调用一些东西。是的,我同意,但我没有找到这种方法,你可能可以减少延迟,2000ms只是一个例子
 setState((){
    markerIconButton = new Image.asset(backgroundImage);
    markerText = new Text(markerText);
  });
  Future.delayed(Duration(milliseconds: 2000));
  // Convert the widget to image
  BitmapDescriptor testIcon = await getCustomIcon(iconKey);