initState中的Flutter提供者

时间:2019-08-19 15:09:11

标签: flutter provider

我目前正在尝试将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();
  }
}

4 个答案:

答案 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);
  }
}