flutter - 等待future.then()完成- flutter

标签 flutter dart

我有下面的功能应返回SharedPreference实例:

SharedPreferences get sp {
    Future<SharedPreferences> prefs = SharedPreferences.getInstance();
    SharedPreferences temp;
    prefs.then((value) { temp = value; });
    return temp; //This is running immediately before completion and returning null 
}

我来自iOS背景。有DispatchGroup可以帮助我们解决相同的问题:
SharedPreferences get sp {
        Future<SharedPreferences> prefs = SharedPreferences.getInstance();
        SharedPreferences temp;
        //dispatchGroup.enter()
        prefs.then((value) { 
           temp = value; 
           //dispatchGroup.leave()
        });
        //dispatchGroup.wait()
        return temp; //This is running immediately before completion 
   }

我们如何才能使future.then()等待其完成,然后将控制权传递给下一行?在flutter中是否有类似于iOS的DispatchGroup的东西?

更新:

我正在寻找一种获取SharedPreferences实例的方法,以便在下面的示例中使用它:
bool get isLoggedIn => sp.getBool('IsLoggedIn');
set isLoggedIn(bool loggedIn) => sp.setBool('IsLoggedIn', loggedIn);

String get userPhone => sp.getString('UserPhone');
set userPhone(String phone) => sp.setString('UserPhone', phone);

更新2

到目前为止,下面是用于管理整个应用程序中的SharedPreferences的完整类:
class UserDefaults
{
  SharedPreferences sp;

  //Singleton
  UserDefaults._internal();
  static final UserDefaults _instance = UserDefaults._internal();
  factory UserDefaults() {
    _instance.initPreferences();
    return _instance;
  }

  initPreferences() async {
    sp = await SharedPreferences.getInstance();
  }

  /*
  SharedPreferences get sp {
    Future<SharedPreferences> prefs = SharedPreferences.getInstance();
    SharedPreferences temp;
    prefs.then((value) { temp = value; });
    return temp;
  }
  */

  bool get isLoggedIn => sp.getBool('IsLoggedIn');
  set isLoggedIn(bool loggedIn) => sp.setBool('IsLoggedIn', loggedIn);

  String get userPhone => sp.getString('UserPhone');
  set userPhone(String phone) => sp.setString('UserPhone', phone);
}

好了,当从main()函数调用UserDefaults()。isLoggedIn时出现错误:'null调用了'getBool'。我猜是因为initPreferences需要一些时间。

最佳答案

将代码放入异步功能:

SharedPreferences sp

loadPrefs() async {
    sp = await SharedPreferences.getInstance();
}

bool get isLoggedIn => sp.getBool('IsLoggedIn');
set isLoggedIn(bool loggedIn) => sp.setBool('IsLoggedIn', loggedIn);

String get userPhone => sp.getString('UserPhone');
set userPhone(String phone) => sp.setString('UserPhone', phone);


在初始化时调用loadPrefs()

关于flutter - 等待future.then()完成- flutter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58851564/

相关文章:

flutter - 步进中的Flutter radio 值未更改

flutter - 在flutter中使用 `Draggable`时如何设置反馈和指针之间的偏移量?

d3.js - d3.dart 0.2.0 - 找不到方法 : '_proxy'

flutter - 在 Dart 中为无效参数抛出异常(例如登录)?

flutter - 如果使用 onDoubleTap,InkWell 效果会延迟启动;想要在触摸小部件时立即触发

firebase - 无法将FLUTTER参数分配给参数类型

dart - 一个项目中有多个 SharedPreferences

dart - BottomNavigationBarItem 中添加的四个图标不起作用

Flutter - 使用 PageRouteBuilder 时半透明页面无法正常工作

flutter - 获取 Container 获取 Header 下面屏幕的剩余空间