Я пытаюсь использовать State Notifier от Riverpod, вот мой код
import 'package:flutter_riverpod/flutter_riverpod.dart';
class CitiesState {
List<String> cities = [];
String selectedCity = "New York";
CitiesState({required this.cities, required this.selectedCity});
}
class ChooseCityPageModel extends StateNotifier<AsyncValue<CitiesState>> {
ChooseCityPageModel(): super(AsyncValue.loading());
Future<void> updateCitiesData() async {
state = AsyncValue.loading();
try {
final latestCities = await myAPI.getAvailableCities();
state = AsyncValue.data(
ChooseCityPageState(
selectedCity: '??????', // <------ I need to get the previous selectedCity state
cities: latestCities, // <---- because I just want to update available cities
),
);
} catch (error) {
state = AsyncValue.error(error);
}
}
}
как видите, у меня есть способ обновить доступные города с сервера. но состояние неизменно, верно? и мне нужно снова создать экземпляр.
но мне нужно сохранить значение selectedCityиз предыдущего состояния, потому что я просто хочу обновить citiesсвойство
как это сделать? извините, я новичок во флаттере
Решение проблемы
Прочитайте предыдущее состояние и используйте это значение для определения нового состояния.
state = AsyncValue.data(
CitiesState(
selectedCity: state.data!.value.selectedCity,
cities: latestCities,
),
);
Использование такого пакета, как заморозка, делает это еще проще.
@freezed
class CitiesState with _$CitiesState {
const factory CitiesState({
required List<String> cities,
required String selectedCity,
}) = _CitiesState;
}
state = AsyncValue.data(state.data!.value.copyWith(cities: latestCities));
Комментариев нет:
Отправить комментарий