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

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

【问题讨论】:

  • 我也在为此苦苦挣扎,你找到解决方案了吗?

标签: flutter flutter-listview flutter-state


【解决方案1】:

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

  1. 使用异步等待定义名为 sqlData() 的函数
  2. 在 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;
        });     
      }
    

    【讨论】:

      猜你喜欢
      • 2018-08-06
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-02-22
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多