如何在 initstate() 中读取和使用共享偏好值?我可以在其他小部件中读取和使用值,但不能在我在 initstate 中调用的 API 中读取和使用值

Posted

技术标签:

【中文标题】如何在 initstate() 中读取和使用共享偏好值?我可以在其他小部件中读取和使用值,但不能在我在 initstate 中调用的 API 中读取和使用值【英文标题】:How to read and use shared preference values in initstate()? I can read and use values in other widgets but not in my API which i call in initstate 【发布时间】:2019-08-29 13:20:51 【问题描述】:

我正在 initstate 中通过 RestAPI 创建一个企业列表。我需要使用 sharedpreference 值作为其参数之一,但是当我尝试加载数据时,sharepreference 值为 null 初始值,但该值可以轻松用于其他小部件。

问题是如何在initstate中同时读取sharepreference值和使用?

我尝试了许多选项,例如将我的 api 从 initstate 中取出并使用 async 函数定义并在 initstate 中调用它。

**@override
  void initState() 
    super.initState();
    loadData();
    getBizList();
  
  getBizList() async 
    await api
        .bizListAPI(widget.subCatid, savedCityID, supSubFinal, areaFinal)
        .then((response) 
      setState(() 
        bizListOBJ = response;
      );
    );
  
loadData() async 
    SharedPreferences savedPref = await SharedPreferences.getInstance();
    setState(() 
      savedCity = (savedPref.getString('savedCity') ?? "Mumbai");
      savedCityID = (savedPref.getString('savedCityID') ?? "1");
    );
  **

在上面的代码中,我能够从 appbar 中的 sharedpreference(savedCity) 获取或读取数据并显示城市名称,但我想使用 savedcityID 数据在 initstate 中传递我的 api。

我也尝试使用以下插件

[https://medium.com/@greg.perry/a-flutter-class-for-app-preferences-a256166ecc63.][1]

有了这个我可以做我想做的事,但每次我关闭我的应用程序并再次打开...... 我收到以下错误

"_prefsInstance != null,
        "Maybe call Prefs.getKeysF() instead. SharedPreferences not ready yet!");"

之后,当我返回并再次打开页面时,应用程序和商务列表完美运行,直到我再次关闭我的应用程序。

 [1]: https://medium.com/@greg.perry/a-flutter-class-for-app-preferences-a256166ecc63

抱歉我的任何菜鸟解释或问题。实际上这是我在堆栈中的第一个问题,我是颤振的初学者。

【问题讨论】:

【参考方案1】:

你可以试试这个吗?

void initState() 
  super.initState();
  loadData().then((_) 
    getBizList();
  );

【讨论】:

我试过这个,它成功了......谢谢,但我发现另一种解决方案更方便,方法是将我的所有 api 放在异步函数中,然后让我的 api 等待响应,最后将函数放入initstate()中,【参考方案2】:

你需要在 init state 中使用 set state 因为

    loadData();
    getBizList();

是异步功能,所以你需要刷新页面才能获得价值。

试试这个

 @override
  void initState() 
    // TODO: implement initState
    super.initState();
    setState(() 
      loadData();
      getBizList();
    );
  

【讨论】:

对不起,这不是你的做法。 setstate 是必须的,但在这里对我没有帮助。

以上是关于如何在 initstate() 中读取和使用共享偏好值?我可以在其他小部件中读取和使用值,但不能在我在 initstate 中调用的 API 中读取和使用值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 initState 方法中访问颤振块?

如何在使用 pop 时重新加载或调用一些函数 initState()

在 initState 中获取 InheritedWidget 参数

如何在flutter中调用initState中的异步方法

如何在颤动中从父小部件调用子小部件的initState()方法

如何测试 initState() 中有异步调用的 Flutter 应用程序?