notifyListeners() 不向 UI 返回数据

Posted

技术标签:

【中文标题】notifyListeners() 不向 UI 返回数据【英文标题】:notifyListeners() does not return data to UI 【发布时间】:2021-11-16 10:41:24 【问题描述】:

我是 Flutter 新手,需要一些帮助 我有这个带有 GoogleMaps 的屏幕(此处为简化版):

class OrderDetailsScreen1 extends StatefulWidget 
  const OrderDetailsScreen1(
    Key? key,
  ) : super(key: key);

  @override
  _OrderDetailsScreen1State createState() => _OrderDetailsScreen1State();


class _OrderDetailsScreen1State extends State<OrderDetailsScreen1> 
  @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;
    

    return Scaffold(
      body: SafeArea(
        child: SizedBox(
          height: 300,
          child: GoogleMap(
            myLocationEnabled: true,
            initialCameraPosition: CameraPosition(
              target: LatLng(latitude, longitude),
              zoom: 14,
            ),
          ),
        ),
      ),
    );
  

我像这样从上一个屏幕推送这个屏幕

onTap: () 
   Navigator.push(
       context,
       MaterialPageRoute(
          builder: (_) => Provider<GoogleMapsNotifier>(
              create: (_) => GoogleMapsNotifier(),
              child: OrderDetailsScreen1(
        ),
     )));
,

我有这样的课程GoogleMapsNotifier with ChangeNotifier

class GoogleMapsNotifier with ChangeNotifier 
  final geolocatorService = GeolocatorService();

  Position? currentLocation;

  GoogleMapsNotifier() 
    setCurrentLocation();
  

  setCurrentLocation() async 
    currentLocation = await geolocatorService.determinePosition();
    print(currentLocation!.latitude);

    notifyListeners();
  

GoogleMapsNotifiersetCurrentLocation() 内部,currentLocation 很好,并且打印得很好。但是notifyListeners() 不会将数据传回 UI (OrderDetailsS​​creen1)。它没有反应,我在控制台中没有错误。哪里错了?

UPD:我尝试将 MaterialPageRoute 更改为以下内容,但没有帮助

onTap: () 
      Navigator.push(
        context,
        MaterialPageRoute(
            builder: (_) => Provider.value(                                     
               value: Provider.of<GoogleMapsNotifier>(context),
               child: OrderDetailsScreen1(),
         )));
,

【问题讨论】:

【参考方案1】:

你应该通过现有的提供者

onTap: () 
   Navigator.push(
       context,
       MaterialPageRoute(
          builder: (_) => Provider.value(
              value: googleMapsNotifier,
              child: OrderDetailsScreen1(
        ),
     )));
,

【讨论】:

我试过了,但没有任何改变。请参阅主帖的更新我是如何设置的。 @MarchukAnton,如果您的 googleMapsNotifierProvider 在 OrderDetailScreen1 树上,请检查 Devtools。并记住 Provider 创建,创建该提供程序的新实例。它不会使用已更改的现有提供程序。【参考方案2】:

您需要使用特定提供商的消费者来包装您的 Ui 小部件。因此它将通过提供程序更新您的 Ui 状态。

【讨论】:

以上是关于notifyListeners() 不向 UI 返回数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥 notifyListeners() 不更新消费者?

消费者未使用 notifyListeners() 进行更新

NotifyListeners 未更新 Flutter Widget

颤振 notifyListeners 似乎不起作用

提供者 NotifyListeners 不更新消费者

Provider 调用 notifyListeners() 时 Flutter View 不更新视图