You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Provider调用notifyListeners()后UI未接收数据如何解决

问题根因

  1. 路由创建Notifier时使用了普通Provider,该类型Provider不支持监听ChangeNotifier触发的notifyListeners更新通知,UI无法收到状态变更信号。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:36:05