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"); 用于从共享首选项中获取值。

所以基本上您不需要等待共享首选项已初始化。