Flutter:Shared Preferences 每次重新加载两次以更新 flutter 中的值
Flutter: Shared Preferences taking two reloads each and every time to update a value in flutter
我是新手,刚开始编码。我正在使用 flutter 制作一个简单的应用程序,它每天打印一条新报价,我为此使用共享首选项,它需要两次热重启或打开应用程序两次来更新值。我不确定为什么会这样,请您说明一下。这是我的代码:
Future<int> setDay(n) async {
final pref = await SharedPreferences.getInstance();
pref.setInt('day', n);
}
Future<String> setQuote() async {
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setString('quote', fromallquotes['$randomnumber']);
}
Future<String> changequote() async {
final pref = await SharedPreferences.getInstance();
var currentday = pref.getInt('day');
var quote = pref.getString('quote');
if (quote == null) {
todaysquote = fromallquotes["$randomnumber"];
}
if (currentday == DateTime.now().weekday) {
todaysquote = quote;
} else {
setQuote();
todaysquote = quote;
setDay(DateTime.now().weekday);
}
return todaysquote;
}
当您从 sharedpreferences 获取它们时,第一次报价和日期都将为空值。所以你设置的是随机报价。
else {
setQuote();
todaysquote = quote;
setDay(DateTime.now().weekday);
}
else 部分运行并设置 todaysquote = quote;
但引用为空,因此您的 todaysquote
returns 为空,第二次打开应用程序时一切正常。
让我给你我的代码片段,这样你就会明白了
import 'package:shared_preferences/shared_preferences.dart';
class SPHelper {
static SharedPreferences prefs;
static void setPref(SharedPreferences prefs1) {
prefs = prefs1;
}
static int getInt(String key) {
return prefs.getInt(key) ?? 0;
}
static void setInt(String key, int value) {
prefs.setInt(key, value);
//prefs.commit();
}
static void setStringList(String key, List<String> lstCart) {
prefs.setStringList(key, lstCart);
}
static List<String> getStringList(String key) {
return (prefs.containsKey(key)) ? prefs.getString(key) : List<String>();
}
static void removeCartList(String key) {
var lst = List<String>();
prefs.setStringList(key, lst);
}
static String getString(String key) {
return prefs.getString(key) ?? "";
}
static void setString(String key, String value) {
prefs.setString(key, value);
//prefs.commit();
}
static void logout() {
prefs.clear();
}
}
现在你只需要像这样在主函数中调用它
void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]).then((_) {
SharedPreferences.getInstance().then((SharedPreferences sp) {
SPHelper.setPref(sp);
setpLocator();
runApp(MyApp());
});
});
}
现在,只要您想使用共享首选项,您只需执行此操作即可将值设置为共享首选项
SPHelper.setString("ID", value);
和 SPHelper.getString("ID");
用于从共享首选项中获取值。
所以基本上您不需要等待共享首选项已初始化。
我是新手,刚开始编码。我正在使用 flutter 制作一个简单的应用程序,它每天打印一条新报价,我为此使用共享首选项,它需要两次热重启或打开应用程序两次来更新值。我不确定为什么会这样,请您说明一下。这是我的代码:
Future<int> setDay(n) async {
final pref = await SharedPreferences.getInstance();
pref.setInt('day', n);
}
Future<String> setQuote() async {
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setString('quote', fromallquotes['$randomnumber']);
}
Future<String> changequote() async {
final pref = await SharedPreferences.getInstance();
var currentday = pref.getInt('day');
var quote = pref.getString('quote');
if (quote == null) {
todaysquote = fromallquotes["$randomnumber"];
}
if (currentday == DateTime.now().weekday) {
todaysquote = quote;
} else {
setQuote();
todaysquote = quote;
setDay(DateTime.now().weekday);
}
return todaysquote;
}
当您从 sharedpreferences 获取它们时,第一次报价和日期都将为空值。所以你设置的是随机报价。
else {
setQuote();
todaysquote = quote;
setDay(DateTime.now().weekday);
}
else 部分运行并设置 todaysquote = quote;
但引用为空,因此您的 todaysquote
returns 为空,第二次打开应用程序时一切正常。
让我给你我的代码片段,这样你就会明白了
import 'package:shared_preferences/shared_preferences.dart';
class SPHelper {
static SharedPreferences prefs;
static void setPref(SharedPreferences prefs1) {
prefs = prefs1;
}
static int getInt(String key) {
return prefs.getInt(key) ?? 0;
}
static void setInt(String key, int value) {
prefs.setInt(key, value);
//prefs.commit();
}
static void setStringList(String key, List<String> lstCart) {
prefs.setStringList(key, lstCart);
}
static List<String> getStringList(String key) {
return (prefs.containsKey(key)) ? prefs.getString(key) : List<String>();
}
static void removeCartList(String key) {
var lst = List<String>();
prefs.setStringList(key, lst);
}
static String getString(String key) {
return prefs.getString(key) ?? "";
}
static void setString(String key, String value) {
prefs.setString(key, value);
//prefs.commit();
}
static void logout() {
prefs.clear();
}
}
现在你只需要像这样在主函数中调用它
void main() {
WidgetsFlutterBinding.ensureInitialized();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]).then((_) {
SharedPreferences.getInstance().then((SharedPreferences sp) {
SPHelper.setPref(sp);
setpLocator();
runApp(MyApp());
});
});
}
现在,只要您想使用共享首选项,您只需执行此操作即可将值设置为共享首选项
SPHelper.setString("ID", value);
和 SPHelper.getString("ID");
用于从共享首选项中获取值。
所以基本上您不需要等待共享首选项已初始化。