Flutter中Provider调用notifyListeners()后UI未接收数据如何解决
问题根因
- 路由创建Notifier时使用了普通
Provider,该类型Provider不支持监听ChangeNotifier触发的notifyListeners更新通知,UI无法收到状态变更信号。 GoogleMap的initialCameraPosition是一次性初始化参数,仅在组件首次渲染时生效,后续即使经纬度变量值更新,GoogleMap也不会自动调整摄像头位置。
解决方案
步骤1:替换Provider为ChangeNotifierProvider
修改路由跳转逻辑,使用支持监听ChangeNotifier的ChangeNotifierProvider创建/传递Notifier实例:
onTap: () { Navigator.push( context, MaterialPageRoute( builder: (_) => ChangeNotifierProvider<GoogleMapsNotifier>( create: (_) => GoogleMapsNotifier(), child: const OrderDetailsScreen1(), ))); },
如果你使用Provider.value形式传递已存在的实例,对应修改为ChangeNotifierProvider.value即可。
步骤2:增加GoogleMap控制器主动更新摄像头位置
给GoogleMap添加控制器,在位置更新后主动调用控制器方法调整地图位置,修改后的页面代码如下:
class OrderDetailsScreen1 extends StatefulWidget { const OrderDetailsScreen1({ Key? key, }) : super(key: key); @override _OrderDetailsScreen1State createState() => _OrderDetailsScreen1State(); } class _OrderDetailsScreen1State extends State<OrderDetailsScreen1> { GoogleMapController? _mapController; @override Widget build(BuildContext context) { final googleMapsNotifier = Provider.of<GoogleMapsNotifier>(context, listen: true); double latitude = -33.75; double longitude = -70.67; if (googleMapsNotifier.currentLocation != null) { latitude = googleMapsNotifier.currentLocation!.latitude; longitude = googleMapsNotifier.currentLocation!.longitude; // 位置更新后主动移动地图摄像头 _mapController?.moveCamera( CameraUpdate.newLatLng(LatLng(latitude, longitude)) ); } return Scaffold( body: SafeArea( child: SizedBox( height: 300, child: GoogleMap( myLocationEnabled: true, initialCameraPosition: CameraPosition( target: LatLng(latitude, longitude), zoom: 14, ), // 地图初始化完成后赋值控制器 onMapCreated: (controller) { _mapController = controller; }, ), ), ), ); } @override void dispose() { _mapController?.dispose(); super.dispose(); } }
内容的提问来源于stack exchange,提问作者TonyWyomy
相关产品推荐
相关产品推荐

