initState 中的 Flutter 提供程序

use*_*845 13 provider flutter

我目前正在尝试将 Provider 作为状态管理解决方案,我知道它不能在 initState 函数中使用。

我见过的所有示例都ChangeNotifier根据用户操作(例如,用户单击按钮)调用派生类中的方法,但是如果我需要在初始化状态时调用方法怎么办?

动机:创建一个加载资产(异步)并显示进度的屏幕

ChangeNotifier该类的示例(不能add从调用initState):

import 'package:flutter/foundation.dart';

class ProgressData extends ChangeNotifier {
  double _progress = 0;

  double get progress => _progress;

  void add(double dProgress) {
    _progress += dProgress;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 14

您可以从您的构造函数调用此类方法ChangeNotifier

class MyNotifier with ChangeNotifier {
  MyNotifier() {
    someMethod();
  }

  void someMethod() {
    // TODO: do something
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果在构造函数中调用notifyListeners()并在build方法中使用provider,是否会导致无限重建?或者 MyNotifier 可能只会实例化一次,就像单例一样?如能解释,将不胜感激。 (3认同)

eja*_*abu 7

将您的代码更改为此


class ProgressData extends ChangeNotifier {
  double _progress = 0;

  double get progress => _progress;

  void add(double dProgress) async {
    // Loading Assets maybe async process with its network call, etc.
    _progress += dProgress;
    notifyListeners();
  }

  ProgressData() {
    add();
  }
}

Run Code Online (Sandbox Code Playgroud)


Fat*_*ari 5

在 initState 中,所有 of(context) 事物都无法正常工作,因为小部件未与 initState 中的所有事物完全连接。您可以使用此代码:

Provider.of<ProgressData>(context, listen: false).add(progress);
Run Code Online (Sandbox Code Playgroud)

或者这段代码:

Future.delayed(Duration.zero).then((_) {
 Provider.of<ProgressData>(context).add(progress)
});
Run Code Online (Sandbox Code Playgroud)