我目前正在尝试将Provider作为一种状态管理解决方案,并且我知道它不能在initState函数中使用。
我看到的所有示例都根据用户操作(例如,用户单击按钮)在派生的ChangeNotifier
类内调用方法,但是如果在初始化状态时需要调用方法怎么办? / p>
动机: 创建一个加载资产(异步)并显示进度的屏幕
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();
}
}
答案 0 :(得分:4)
在initState中,所有of(context)事物均无法正常工作,因为该小部件并未完全与initState中的所有事物连接在一起。 您可以使用以下代码:
Future.delayed(Duration.zero).then(_){
Provider.of<ProgressData>(context).add(progress)
}):
或此代码:
Save Field Names (CSV)
答案 1 :(得分:3)
您可以从ChangeNotifier
的构造函数中调用此类方法:
class MyNotifier with ChangeNotifier {
MyNotifier() {
someMethod();
}
void someMethod() {
// TODO: do something
}
}
答案 2 :(得分:2)
将代码更改为此
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();
}
}
答案 3 :(得分:0)
我想,一个报告进度的AssetLoader类看起来像这样:
import 'package:flutter/foundation.dart';
class ProgressData extends ChangeNotifier {
double _progress = 0;
ProgressData() {
_loadFake();
}
Future<void> _loadFake() async {
await _delayed(true, Duration(seconds: 1));
_add(1.0);
await _delayed(true, Duration(seconds: 2));
_add(2.0);
await _delayed(true, Duration(seconds: 3));
_add(3.0);
}
// progress
double get progress => _progress;
// add
void _add(double dProgress) {
_progress += dProgress;
notifyListeners();
}
// _delayed
Future<dynamic> _delayed(dynamic returnVal, Duration duration) {
return Future.delayed(duration, () => returnVal);
}
}