【问题标题】:When we use notifyListeners in ChangeNotifier?当我们在 ChangeNotifier 中使用 notifyListeners 时?
【发布时间】:2021-03-22 22:54:07
【问题描述】:

为什么我们有时会使用 notifyListeners,以及为什么我们不使用 notifyListeners?如何在 changenotifier 中使用函数?

例如,在这段代码中,有时我们使用 notifyListeners,但有时我们没有使用 notifyListeners(在 login() 函数中)。为什么 ?我们什么时候使用 notifyListeners?

String get userEmail => _userEmail;

  set userEmail(String value) {
    _userEmail = value;
    notifyListeners();
  }

  String get userPassword => _userPassword;

  set userPassword(String value) {
    _userPassword = value;
    notifyListeners();
  }

  String get userName => _userName;

  set userName(String value) {
    _userName = value;
    notifyListeners();
  }

  DateTime get dateOfBirth => _dateOfBirth;

  set dateOfBirth(DateTime value) {
    _dateOfBirth = value;
    notifyListeners();
  }

  Future<bool> login() async {
    try {
      isLoading = true;

      print(userEmail);
      print(userPassword);

      if (isLogin) {
        await FirebaseAuth.instance.signInWithEmailAndPassword(
          email: userEmail,
          password: userPassword,
        );
      } else {
        await FirebaseAuth.instance.createUserWithEmailAndPassword(
          email: userEmail,
          password: userPassword,
        );
      }

      isLoading = false;
      return true;
    } catch (err) {
      print(err);
      isLoading = false;
      return false;
    }
  }
}

除了有人可以回答我为什么我们在这段代码中使用 set 方法

  bool get isLogin => _isLogin;

  set isLogin(bool value) {
    _isLogin = value;
    notifyListeners();
  }

【问题讨论】:

    标签: flutter dart state-management flutter-change-notifier


    【解决方案1】:

    每当您想要触发重建或当有一个活动的侦听器正在监视更改以执行某些操作时,都会使用方法notifyListeners()

    假设一个场景,你有一个数据模型,一旦你从 API 中获取数据,你想解析它并填写模型类,你还希望 UI 在获取数据后自动重建!

    为此,您可以在数据类和 UI 代码中使用 notifyListeners(),您可以使用 ChangeNotifierProviderConsumer 小部件包装需要重建的部分,该小部件将监控更改并尽快当他们遇到任何变化时,他们将重建底层的 Widget。

    在您上面共享的代码中,您使用了无法在此文件之外访问的 private 字段,并且您正在使用 getterssetters 基本上检索并修改它们

    现在回答你的最后一个问题, 我们使用set方法或者setter来基本更新或者修改一个值(一般是私有值)

    只是为您提供一些额外的信息, 为了“安全”,您应该将字段包装在 getter 和 setter 中。 此方法较旧,在 Dart 语言中不需要

    你可以阅读更多关于这个here

    您还可以在 dart here 中阅读有关 getter 和 setter 的信息。

    由于您是 StackOverflow 的新手,我欢迎您。 快乐飘飘!

    【讨论】:

    • 我现在明白了。因此,如果我想更新 UI,那么我必须使用通知侦听器,我想对吗?
    猜你喜欢
    • 1970-01-01
    • 2020-05-12
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2022-11-14
    • 2019-11-18
    • 2020-06-03
    相关资源
    最近更新 更多