Estou criando uma demonstração para adicionar e remover IDs de produtos favoritos de uma lista obs e depois salvá-los no armazenamento local...
Ao iniciar o aplicativo, ele deve buscar todos os IDs de produtos favoritos do armazenamento.
Ao salvar no armazenamento, estou salvando um List
de String
, e aqui não consigo entender como digitar cast durante a leitura do armazenamento, pois está mostrando dinâmico... Como converter esse dinâmico para List
de String
para que eu possa atribuí-lo à lista de favoritos do meu controlador, que é um List
de String
.
Então, minha principal dúvida é como converter para o tipo de dados necessário durante a leitura do armazenamento.
Como eu vou economizar List
, int
algum tempo, List
etc ProductModel
...
class FavouriteController extends GetxController {
RxList<String> favourites = <String>[].obs;
@override
void onInit() {
// TODO: implement onInit
super.onInit();
fetchFavouritesFromStorage();// fetching all ids from storage
}
void addFavourite(String id) {
if (favourites.contains(id)) {
favourites.remove(id);
} else {
favourites.add(id);
}
MyLocalStorage.instance().saveData('Favourites', favourites);
}
void fetchFavouritesFromStorage() async {
final data = await MyLocalStorage.instance().readData('Favourites');
if (data == null) {
print('Null');
} else {
final data = MyLocalStorage.instance().readData('Favourites');
favourites.assignAll(data); // this line is resulting an error
}
}
}
Aqui está minha classe de armazenamento local. Ela foi retirada de um exemplo de código do youtuber:
class MyLocalStorage {
// static final MyLocalStorage _instance = MyLocalStorage._internal();
late final GetStorage _storage;
static MyLocalStorage? _instance;
MyLocalStorage._internal();
factory MyLocalStorage.instance() {
_instance??=MyLocalStorage._internal();
return _instance!;
}
static Future<void> init(String bucketName) async
{
await GetStorage.init(bucketName);
_instance=MyLocalStorage._internal();
_instance!._storage=GetStorage(bucketName);
}
//save data
Future<void> saveData<T>(String key,T value) async{
await _storage.write(key, value);
}
T? readData<T>(String key) {
return _storage.read<T>(key);
}
Future<void> removeData(String key) async{
await _storage.remove(key);
}
Future<void> clearAll() async{
await _storage.erase();
}
}
2 passos aqui:
read
método deGetStorage
e, inerentemente,readData
deMyLocalStorage
recebe parâmetro de tipoT
para entender qual tipo será retornado deste método. Por causa disso, você pode invocarreadData
assim:List<dynamic>
o tipo paradata
o qual ainda não é suficiente para sua tarefa, pois você precisa que ele seja.List<String>
Você pode usar este código:Este código garantirá que cada elemento seja
String
, mesmo que não seja.