2

我正在使用颤振制作一个简单的记事本应用程序。我想从 SQLite 数据库加载已经保存的数据并在应用程序打开时初始化状态。我尝试使用带有异步方法的 initState() 方法。但是异步方法在 initState() 方法中不起作用。有些地方说要使用 Future builder 和 BLoC。但我不太确定哪个好。在颤振中实现这一点的最佳方法是什么?

4

3 回答 3

0

你有两个选择。

选项 1:按照@UtakarshSharma 所说的去做。下面的示例实现。

@override
  void initState() {
    super.initState();
    _requestSqlData();     
  }

void _requestSqlData(){
   _requestSqlDataAsync();  
}

void _requestSqlData() async {
    var _data = await getData();    // call API/await function to get the data
}

选项2:在全屏加载后使用回调方法。并使用 setState 更新屏幕。您必须使用 flutter_after_layout ( https://github.com/slightfoot/flutter_after_layout ) 它在布局完成后执行该功能。:

void initState() {
    super.initState();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => myAwesomeFunction(context));
}
于 2020-03-21T06:37:14.827 回答
0

如果您知道如何从 sql lite 加载数据,则使用 async 和 await 在 initstate() 之外定义该函数并在 initstate() 中调用它。Initstate 不能是异步的,因为它必须在您的主应用程序之前运行,因此我们可以使用外部函数。

  1. 使用异步等待定义名为 sqlData() 的函数
  2. 在 initstate 中调用它。
于 2020-03-21T04:32:49.867 回答
0

我发现这种方法对我有用。在你的异步函数上使用 .then()

@override
  void initState() {
    super.initState();
    db.getData().then((value){
      _valueState = value;
    });     
  }
于 2020-07-25T06:58:00.867 回答