标签: flutter-sharedpreference

无法在 flutter 中使用 GetIt 初始化 Shared Pref

我想在我的 flutter 应用程序中使用共享首选项实现会话管理系统。对于依赖注入,我使用 GetIt 库。但是当我运行应用程序时,它显示“flutter:创建会话时出错”“构建构建器(脏)抛出以下 ArgumentError:无效参数(SharedPreferences 类型的对象未在 GetIt 内注册。您是否忘记传递实例名称?(您是否不小心执行了 GetIt sl=GetIt.instance(); 而不是 GetIt sl=GetIt.instance;)):SharedPreferences'

Session.dart

abstract class Session {
  void storeLoginInfo(String accessToken);
  bool isUserLoggedIn();
  String getAccessToken();
  void deleteLoginInfo();
}
Run Code Online (Sandbox Code Playgroud)

SessionImpl.dart

class SessionImpl extends Session {
  SharedPreferences sharedPref;

  SessionImpl(SharedPreferences sharedPref) {
    this.sharedPref = sharedPref;
  }

  @override
  void storeLoginInfo(String accessToken) {
    sharedPref.setBool('login_status', true);
    sharedPref.setString('access_token', accessToken);
  }

  @override
  bool isUserLoggedIn() {
    final isLoggedIn = sharedPref.getBool('login_status') ?? false;
    return isLoggedIn;
  }

  @override
  String getAccessToken() {
    return sharedPref.getString('access_token') ?? "";
  }

  @override
  void deleteLoginInfo() { …
Run Code Online (Sandbox Code Playgroud)

service-locator flutter flutter-sharedpreference

6
推荐指数
1
解决办法
2500
查看次数

未从 SharedPreferences 获取更新值

我的 flutter 应用程序正在前台和后台使用电话包监听短信。在注册接收消息时,我使用了两种方法(一种用于前台,一种用于后台,根据电话包的要求,如下所示:

telephony.listenIncomingSms(onNewMessage: onMessage, onBackgroundMessage: onBackgroundMessage);
Run Code Online (Sandbox Code Playgroud)

但在这两个方法内部都调用了一个通用方法,该方法将最近收到的短信保存到共享首选项中,如下所示:

onMessage(SmsMessage message) async {
 ...
 saveLastMsg(message);
}
onBackgroundMessage(SmsMessage message) async {
 ...
 saveLastMsg(message);
}
saveLastMsg(SmsMessage message) async{
  SharedPreferences sp = await SharedPreferences.getInstance();
  sp.setString("lastsmsbody", message.body??'');
}
Run Code Online (Sandbox Code Playgroud)

在应用程序用户界面中,我像这样获取lastsmsbody:

SharedPreferences sp = await SharedPreferences.getInstance();
String body = sp.getString("lastsmsbody")??'';
Run Code Online (Sandbox Code Playgroud)

我在 UI 中显示该值。当应用程序在前台运行时,这工作正常。屏幕上的数据会随着消息的到来而更新。

问题是当应用程序被推入后台时。从日志中,我看到它仍然收到消息并且仍然将其保存在首选项中。但是,当我将应用程序带回到前台时,它无法获取应用程序处于后台时保存的最新消息。sp.getString("lastsmsbody") 获取应用程序位于前台时保存的旧消息。

我认为当应用程序位于 fg 和 bg 时,可能偏好不同。但是,如果我终止应用程序并重新启动,sp.getString("lastsmsbody") 将返回应用程序处于 bg 时保存的最新消息。

有人能告诉我这是怎么回事吗?

sharedpreferences flutter flutter-sharedpreference

3
推荐指数
1
解决办法
1846
查看次数