在 Flutter 中,是不是可以使用 Provider 创建监听函数

Posted

技术标签:

【中文标题】在 Flutter 中,是不是可以使用 Provider 创建监听函数【英文标题】:In Flutter, is it possible to use Provider to create a listener function在 Flutter 中,是否可以使用 Provider 创建监听函数 【发布时间】:2022-01-22 21:58:42 【问题描述】:

所以我有这个提供者

import 'package:flutter/material.dart';
import 'package:gotaxi_flutter/enums.dart';
import 'package:gotaxi_flutter/models/google_places_models/google_places_models.dart';

class PlaceInfo 
  GooglePlace place;
  bool isDestination;
  PlaceInfo(this.place, this.isDestination);


class RideInfoProvider with ChangeNotifier 
  CurrentRideScreen _currentRideScreen = CurrentRideScreen.none;
  PlaceInfo? _place;

  PlaceInfo? get place => _place;

  CurrentRideScreen get currentRideScreen => _currentRideScreen;

  void setCurrentRideScreen(CurrentRideScreen screen) 
    _currentRideScreen = screen;
    notifyListeners();
  

  //set origin or destination locations
  void setPlace(GooglePlace place, bool isDestination) 
    _place = PlaceInfo(place, isDestination);
    notifyListeners();
  

如何在我的小部件中创建类似于以下内容的内容:

@override
  void initState() 
    super.initState();

    _rideInfoProvider = RideInfoProvider();

    _rideInfoProvider.addListener(() 
      print("RideInfoProvider changed");
      if (_rideInfoProvider.place != null) 
        print(_rideInfoProvider.place);
        //run other functions or instances that exist in this widget and may utilize the place variable
      
    );


否则,我必须将整个侦听器逻辑和变量移至提供程序。

【问题讨论】:

为什么不能通过consumer 使用提供程序的正常方式? 【参考方案1】:

您可以根据有状态的小部件生命周期添加和删除您的侦听器。 这意味着在每次从RideInfoProvider 调用notifyListeners() 时都会调用myListenerFunction,直到小部件被释放。 务必将侦听器添加为单独的函数,以便稍后通过相同的引用(到函数)将其删除。

正如@josip-domazet 评论的那样,我不建议为此使用消费者,因为这会从小部件的构建方法内部调用myListenerFunction,因此每次颤振重绘该小部件时都会调用它,而不是仅当在通知程序中进行了新更改时。

@override
  void initState() 
    super.initState();

    _rideInfoProvider = context.read<RideInfoProvider>();

    _rideInfoProvider.addListener(myListenerFunction);




@override
  void dispose() 
    super.dispose();

    _rideInfoProvider.removeListener(myListenerFunction);


【讨论】:

以上是关于在 Flutter 中,是不是可以使用 Provider 创建监听函数的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:是不是可以替换小部件本身?

如何检测我的 Flutter 应用程序是不是在 Web 中运行?

在 Flutter 包中使用自定义图标字体显示问号而不是自定义图标

Flutter,Android - 是不是可以在启动(启动)屏幕上更改状态栏颜色?

如何检测 GestureDetector 是不是悬停在 Flutter 中?

Flutter 可重用组件