如何在 flutter 中存储和检索共享首选项中的项目列表

问题描述 投票:0回答:0

只要用户预订行程,然后将其作为列表检索,就尝试将一些项目存储在共享首选项中。 我尝试了这种方法,但即使我预订了不止一次旅行,结果也只返回一件商品。从我得到的数据来看,很明显我的代码无法存储项目列表。我认为每当添加新项目时,前一个项目就会被删除。我真的需要一种方法来解决这个问题。 这是我尝试过的。

class TripController extends GetxController{
  final TripRepository tripRepository;
  TripController({required this.tripRepository});

  DateTime bookedDate = DateTime.now();
  DateTime bookedTime = DateTime.now();
  DateFormat df = DateFormat("yyyy-MM-dd");
  DateFormat tf = DateFormat("HH:mm");

  Map<int, TokenModel> _items = {};
  Map<int, TokenModel> get items =>_items;
  List<TokenModel> storageItems = [];
  String _token = "";
  String get token => _token;


Future<BookingResponse> bookATrip(BuildContext context, BookTripModel bookTripModel)async{
    _isLoading = true;
    update();
    Response response = await tripRepository.bookATrip(bookTripModel);
    late BookingResponse bookingResponse;
    try{
      if(response.statusCode==201){
      
        bookingResponse = BookingResponse(response.body["message"],response.body["token"]);
        _token = bookingResponse.token;
        // this is the addToken method called
        addToken(token, storageItems.length+1);
      

      }else{
        showCustomSnackBar(response.body["message"],title: "Error");
        bookingResponse = BookingResponse(response.body["message"], "No Token");
      }

    }catch(e){
      print("The error message is: "+e.toString());
    }
    update();

    return bookingResponse;

  }

void addToken(String tripToken,int itemId){
    _items.putIfAbsent(itemId, () {
      return TokenModel(
        id: itemId,
        time: tf.format(bookedTime),
        date: df.format(bookedDate),
        token: tripToken
      );
    });
    tripRepository.addToTokenList(getTokens);
    update();
  }
  List<TokenModel> get getTokens{
    return _items.entries.map((e) {
      return e.value;
  }).toList();
}

List<TokenModel> getTripTokens(){
    setTokens = tripRepository.getTokens();
    return storageItems;

}
set setTokens(List<TokenModel> items){
    storageItems = items;
    for(int i=0;i<storageItems.length;i++){
      _items.putIfAbsent(storageItems[i].id!, () => storageItems[i]);
    }
}

class TripRepository extends GetxService{
  final ApiClient apiClient;
  final SharedPreferences sharedPreferences;
  TripRepository({required this.apiClient,required this.sharedPreferences});

  List<String> tokenList = [];

  void addToTokenList(List<TokenModel> list){
    tokenList = [];
    list.forEach((element) {
      return tokenList.add(jsonEncode(element));
    });
    sharedPreferences.setStringList(AppUrlConstant.TOKEN_LIST, tokenList);
  }
  List<TokenModel> getTokens(){
    List<String> tokens = [];
    if(sharedPreferences.containsKey(AppUrlConstant.TOKEN_LIST)){
      tokens = sharedPreferences.getStringList(AppUrlConstant.TOKEN_LIST)!;
      print(tokens.toString());
    }
    List<TokenModel> tokenListRetrieved = [];
    tokens.forEach((element) {
      return tokenListRetrieved.add(TokenModel.fromJson(jsonDecode(element)));
    });
    return tokenListRetrieved;
  }
}
flutter sharedpreferences
© www.soinside.com 2019 - 2024. All rights reserved.