【发布时间】:2020-05-13 08:51:12
【问题描述】:
我有 2 个小部件。一个父 StatefulWidget 在第一次满载期间多次更改状态,一个子 StatelessWidget 构建起来很昂贵。
子小部件构建成本高的原因是它使用google_maps_flutter 库,该库使用网络视图在屏幕上显示谷歌地图。
如果可能,我希望此子小部件中的build() 函数只执行一次。
但是,每当由于状态更改而多次构建父窗口小部件时,似乎子窗口小部件也被构建多次。因此,我在第一次加载屏幕时看到了一些卡顿/滞后。
防止子小部件多次重建的最佳方法是什么?
以下是示例代码。
父小部件
class ParentWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => _ParentWidgetState();
}
class _ParentWidgetState extends State<ParentWidget> {
Completer<GoogleMapController> _controller = Completer();
LocationPosition _myPosition;
@override
void initState() {
super.initState();
initialize();
}
void initialize(){
....// other initialization logic which may call `setState()` multiple times
}
Set<Marker> getMarkers(){
....
}
@override
Widget build(BuildContext context) {
return Scaffold(body: GoogleMapWidget(_controller, _myPosition, getMarkers()));
}
}
子小部件
class GoogleMapWidget extends StatelessWidget {
static const double ZOOM = 15;
final Completer<GoogleMapController> _controller;
final Set<Marker> markers;
final LocationPosition _myPosition;
GoogleMapWidget(this._controller, this._myPosition, this.markers);
@override
Widget build(BuildContext context) {
print("Rebuilt"); // <-- This gets printed multiple times, which is not something I want.
return GoogleMap(
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: LatLng(_myPosition.lat, _myPosition.lng),
zoom: ZOOM,
),
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
markers: markers);
}
}
【问题讨论】:
-
我会使用其中一种状态管理系统,而不是尝试手动管理 setState。查看提供程序包。它具有仅在必要时构建的选项。
标签: flutter