我想在我的 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) 我的 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 时保存的最新消息。
有人能告诉我这是怎么回事吗?