如何使用SharedPreferences保存数据类型映射

时间:2020-09-19 03:12:38

标签: flutter sharedpreferences provider

我想通过使用SharedPreferences保存类型为map的提供程序数据,但是我找不到保存类型map的方法。

有没有办法一次保存地图?

//提供者数据

    class SettingDataHandler extends ChangeNotifier {
    
    
      Map<String, dynamic> selectedTimes = {
        "Pomodoro Setting": 15,
        "Rest Time Setting": 5,
        "Long Rest Time Setting": 15,
        "Term of Resting Time Setting": 5
      };
    
      setTime(String typeOfSetting, int changeValue) {
        selectedTimes.update(typeOfSetting, (value) => changeValue);
        notifyListeners();
      }
    }

//这是我使用SharedPreferences的代码

  Future<int> _initPref() async {
      prefs = await SharedPreferences.getInstance();
      var timeData = prefs.get('timeData');
      if (timeData != null) {
        settingDataHandler.selectedTimes["Pomodoro Setting"] = timeData;
      }
    
      pomodoroHandler.pomodoroTime = settingDataHandler.selectedTimes["Pomodoro Setting"];
      pomodoroHandler.time = pomodoroHandler.pomodoroTime * 60;
    
      return 0;
    }


     Future<void> _changedTime() async {
        prefs = await SharedPreferences.getInstance();
        int currentPomodoroTime = settingDataHandler.selectedTimes["Pomodoro Setting"];
        print(currentPomodoroTime);
        await prefs.setInt('timeData', currentPomodoroTime);
      }

2 个答案:

答案 0 :(得分:1)

您只能在共享首选项中保存字符串或字符串列表,而不能直接保存映射。但是您可以使用dart:convert库以及jsonEncode()和jsonDecode()方法将地图转换为字符串,也可以将其保存。

更多信息:https://flutter.dev/docs/development/data-and-backend/json

答案 1 :(得分:1)

没有选择将地图直接保存在共享首选项内。

您必须使用json.encode()方法将地图转换为字符串。当您取回字符串时,必须使用json.decode()对其进行解码。

首先import 'dart:convert';

要将地图保存到共享的首选项中

prefs = await SharedPreferences.getInstance();
Map<String, dynamic> selectedTimes = {
        "Pomodoro Setting": 15,
        "Rest Time Setting": 5,
        "Long Rest Time Setting": 15,
        "Term of Resting Time Setting": 5
      };
String encodedMap = json.encode(selectedTimes);
print(encodedMap);

prefs.setString('timeData', encodedMap);
  

要从共享的首选项中检索地图

String encodedMap = prefs.getString('timeData');
Map<String,dynamic> decodedMap = json.decode(encodedMap);
print(decodedMap);