Flutter应用打开时如何从sqlite数据库加载初始状态数据

Posted

技术标签:

【中文标题】Flutter应用打开时如何从sqlite数据库加载初始状态数据【英文标题】:How to load initial state data from sqlite database when Flutter app open 【发布时间】:2020-07-01 18:22:30 【问题描述】:

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

【问题讨论】:

我也在为此苦苦挣扎,你找到解决方案了吗? 【参考方案1】:

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

    使用异步等待定义名为 sqlData() 的函数 在 initstate 中调用它。

【讨论】:

【参考方案2】:

你有两个选择。

选项 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));

【讨论】:

两者都很好,谢谢。更新状态似乎需要一些时间。可能是我在模拟器上。但是任何建议在启动时更快地加载数据... 如果有帮助,请接受答案。在不知道用例的情况下,很难告诉“方法”更快地加载数据。也许您可以尝试在开始时加载少量数据?或者获取上一屏中的数据,连同数据一起调用本屏!【参考方案3】:

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

@override
  void initState() 
    super.initState();
    db.getData().then((value)
      _valueState = value;
    );     
  

【讨论】:

以上是关于Flutter应用打开时如何从sqlite数据库加载初始状态数据的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase 消息传递 - 应用打开时未显示推送通知

应用打开时制作 Flutter alertdialog

尝试从 android studio 打开时,Xcode 中的 Flutter 打开模块会出错?

键盘打开时如何固定小部件布局?

Flutter Google Map 在 IOS 中首次打开时崩溃

qsqlite设置了密码打开时无密码提示