【问题标题】:How can I reuse expensive widget across the app in Flutter?如何在 Flutter 中跨应用程序重用昂贵的小部件?
【发布时间】:2020-09-01 23:56:08
【问题描述】:

我正在使用 google_maps_flutter 在我的颤振应用程序中嵌入地图。这个小部件的创建成本很高(加载地图图块需要一些时间),所以我想初始化这个小部件一次,保持它的状态,并在用户活动的整个生命周期中重复使用它。

Key googleMapKey = GlobalKey();

....

GoogleMap(
   key: googleMapKey,
   mapType: MapType.normal,
   initialCameraPosition: CameraPosition(target: LatLng(lat, lng),
   onMapCreated: (GoogleMapController controller) {
     print("Map has been initialized");
     ....
   }
   ...
)

到目前为止,我尝试将 GlobalKey() 分配给此小部件,以便在必要时可以重新设置小部件的父级。我确保一个 GlobalKey() 用于不同的页面。

在我的应用中,餐厅列表显示在列表视图中。当用户点击其中一个列表项时,会打开详细信息页面,并且除了其他餐厅详细信息之外,还会加载 GoogleMap 小部件。

但是,当用户返回上一个列表页面,并点击另一个列表项以打开另一个餐厅的详细信息页面时,GoogleMap 似乎被重新初始化,因为我看到“地图已初始化”文本再次显示。

我确实看到了 GlobalKey 的颤振文档中的以下 sn-p,尽管我不确定这是否是原因。

当它们从树中的一个位置移动到树中的另一个位置时,具有全局键的小部件会重新生成其子树。为了重新设置其子树的父级,小部件必须在同一动画帧中到达树中的新位置,在该动画帧中它从树中的旧位置移除。

在我的用例中使用 GlobalKey 的正确方法是什么?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    我不知道这是否正确,我找不到任何知道官方答案的人。

    我知道避免重建的唯一方法是在移动小部件的辅助位置使用 globalKey.currentWidget。

    如果您有更好的解决方案,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 2015-02-02
      • 2011-12-06
      • 2020-09-07
      • 2012-05-17
      • 2020-11-25
      • 1970-01-01
      相关资源
      最近更新 更多