抖动,功能需要等到数据可用

时间:2019-01-13 16:42:35

标签: asynchronous flutter wait synchronous

我是扑扑编程的新手。我正在尝试理解异步函数调用,但步入正轨。

我想以安全的方式将数据存储在设备上。因此,在写入数据时,数据将被加密,而在读取数据时,数据将被解密。应用程序不知道数据已在设备上加密。

我制作了一个使用SharedPreferences库的Storage类。

读取功能的第二个功能是,应用程序将等待直到数据可用为止。

我写了这样的东西

  static String getString(String key)  {
SharedPreferences prefs = await SharedPreferences.getInstance();

return _decrypt(prefs.getString(key));   

}

现在,编译器抱怨不需要await语句。

当我将函数更改为异步函数并返回Future时,它将起作用。但是我的等待问题上升到了调用getString函数的地方。

目标:函数应返回解密的String,并且主线程需要等待直到数据可用为止。

欢迎任何帮助

5 个答案:

答案 0 :(得分:0)

您必须添加关键字async和Future,如下所示:

static Future<String> getString(String key)  async { // ------> here
   SharedPreferences prefs = await SharedPreferences.getInstance();

   return _decrypt(prefs.getString(key));   
}

并且要使用此异步方法,必须按以下方式进行操作:

getString("someKey").then((valueString) => print(valueString));

答案 1 :(得分:0)

永远不要阻塞主线程,因为它会阻塞应用程序操作。初始化可能需要很长时间,并且必要时系统可能会杀死您的应用程序。

要解决您的问题,最好不要阻塞主线程,这可以通过创建加载屏幕,等待数据加载完成并显示最终的应用程序屏幕来完成。

代码原型如下:

class HomePage extends StatefulWidget {
  @override
  HomePageState createState() => HomePageState();
}

class HomePageState extends State<HomePage> {
  String data;

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

    loadData().then((data) {
      setState(() {
        this.data = data; 
      });
    });
  }

  Future loadData() async {    
    data = 'xxx'; // load your data from SharedPreferences
    return data;    
  }

  @override
  Widget build(BuildContext context) {
    if (data == null) {
      loadData();
      return LoadingScreen();
    } else {
      return MainScreen();
    }
  }
}

答案 2 :(得分:0)

抱歉,不够具体。我的页面正在其自己的线程中加载。在线程中,我想从存储中获取值。该线程无法继续,因为下一条语句取决于存储中的数据。

例如我需要商店中的用户名和密码才能登录。用户名和密码分开存储。

当然,我可以嵌套'then'语句,但是我认为从源代码的可读性出发,最好等到从存储中读取该值。

答案 3 :(得分:0)

          Future strUser() async {
            SharedPreferences sharedPreferences = await 
            SharedPreferences.getInstance();
            return sharedPreferences.getInt('strUser');
          }

  init(){
         await SharedPreferenceFunction().strUser().then((value) {
                   setState(() {
                    this.strUser = value; 
                  });
                });
    }

答案 4 :(得分:0)

以这种方式调用这里是我的功能& 设置状态为Imp!

y

并调用

checkInCart()async{
    bool pre=await storage.containsKey(key: '${widget.eventIndex}');
    if(pre) {
      setState(() {
        isavail=true;
        favorite=true;
      });

    }

  }

这必须能正常工作,欢迎使用!