【问题标题】:Flutter: Shared Preferences taking two reloads each and every time to update a value in flutterFlutter:Shared Preferences 每次都会重新加载两次以更新flutter中的值
【发布时间】:2020-10-03 01:20:20
【问题描述】:

我是新手,刚开始编码。我正在使用颤振制作一个简单的应用程序,它每天都会打印一个新报价,我为此使用共享首选项,它需要两次热重启或两次打开应用程序来更新值。我不确定它为什么会发生,请你给我一些启发。这是我的代码:

  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;
}

【问题讨论】:

    标签: flutter sharedpreferences


    【解决方案1】:

    让我给你我的代码sn-p,这样你就会明白了

    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"); 从共享偏好中获取价值。

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

    【讨论】:

      【解决方案2】:

      当您从 sharedpreferences 中获取第一次报价和日期时,它们都将为空值。所以你正在设置一个随机报价。

      else {
          setQuote();
          todaysquote = quote;
          setDay(DateTime.now().weekday);
        }
      

      else 部分运行并设置todaysquote = quote;,但quote 为null,因此您的todaysquote 返回null,第二次打开应用时一切正常。

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 2019-05-16
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-29
        • 2021-08-17
        • 2017-09-23
        相关资源
        最近更新 更多