思路就是tojson转map,然后用jsonEncode转成String(不可以用toString强转,保存不了原来的格式了)。然后用jsonDecode转成map,用fromJsom解析数据
jsonEncode相等于json.encode
jsonDecode相等于json.decode
1.写好本地存储,List

  //打招呼保存用户ID和时间戳
  static setSayHiDataList(List<String> sayHiList) {
    StorageManager.sharedPreferences?.setStringList('sayHiDataList', sayHiList);
  }

  //获取打招呼的用户ID和时间戳
  static get getSayHiDataList =>
      StorageManager.sharedPreferences?.getStringList('sayHiDataList');

2.要存的模型

//一键打招呼保存用户ID和时间戳
class SayHiData{
  String? userId;
  String? dateMs;
  SayHiData({this.userId,this.dateMs});

  SayHiData.fromJson(dynamic json){
    userId = json['userId'];
    dateMs = json['dateMs'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data['userId'] = userId;
    data['dateMs'] = dateMs;
    return data;
  }
}

3.存数据,用toJson转成Map类型然后用jsonEncode转String

      List<String> sayHiDataList = [];
      //获取已经存好的数据
      if (SPHelper.getSayHiDataList == null) {
        SPHelper.setSayHiDataList([]);
        if (SPHelper.getSayHiDataList != null) {
          sayHiDataList = SPHelper.getSayHiDataList;
          SayHiData sayHiData = SayHiData(
              userId: Global.userId,
              dateMs: DateUtil.getNowDateMs().toString());
          sayHiDataList.add(jsonEncode(sayHiData.toJson()));//存数据,用toJson转成Map类型然后用jsonEncode转String
          SPHelper.setSayHiDataList(sayHiDataList);
        }
      } else {
        sayHiDataList = SPHelper.getSayHiDataList;
        SayHiData sayHiData = SayHiData(
            userId: Global.userId, dateMs: DateUtil.getNowDateMs().toString());
        sayHiDataList.add(jsonEncode(sayHiData.toJson()));
        SPHelper.setSayHiDataList(sayHiDataList);
      }

4.用jsonDecode将String转Map,然后用fromJson取值

   if (SPHelper.getSayHiDataList != null) {
          List<String> sayHiDataList = SPHelper.getSayHiDataList;
          for (int i = 0; i < sayHiDataList.length; i++) {
            SayHiData sayHiData =
                SayHiData.fromJson(jsonDecode(sayHiDataList[i]));//用jsonDecode将String转Map,然后用fromJson取值
            if (sayHiData.userId == Global.userId) {
              //获取当前用户ID的一键打招呼的当天次数
              sayHiTime++;
              //保存该用户的下标,用于获取最后一个时间戳
              timeIndex.add(i);
            }
          }
          //下标列表不为空则已经打过招呼,为空则还没打过招呼
          if (timeIndex.isNotEmpty) {
            //获取当前用户的上一次打招呼时间戳
            lastSayHiTime =
                SayHiData.fromJson(jsonDecode(sayHiDataList[timeIndex.last]))
                        .dateMs ??
                    '';
            if (sayHiTime < 3) {
              if (lastSayHiTime != '') {
                lastTimeDate = DateTime.fromMillisecondsSinceEpoch(
                    int.parse(lastSayHiTime));
              } else {
                //没有数据则没打过招呼
                isSayHi = false;
              }
              //超过4个小时可以弹出弹窗
              if (lastTimeDate != null) {
                if (DateTime.now().hour - lastTimeDate.hour >= 4) {
                  isSayHi = false;
                } else {
                  //否则不弹
                  isSayHi = true;
                  Future.delayed(Duration.zero, () {
                    EventBusUtil.fire(
                        QueueDialogEvent(DialogKey.HAS_SAY_HI_DIALOG));
                  });
                }
              }
            } else {
              //超过或等于三次就不可打招呼
              isSayHi = true;
              Future.delayed(Duration.zero, () {
                EventBusUtil.fire(
                    QueueDialogEvent(DialogKey.HAS_SAY_HI_DIALOG));
              });
            }
          }
          if (!isSayHi) {
            //弹出打招呼弹窗
            Future.delayed(Duration.zero, () {
              EventBusUtil.fire(
                  QueueDialogEvent(DialogKey.HAS_NO_SAY_HI_DIALOG));
            });
          }
        }

更多推荐