GOOGLE ADS

понедельник, 11 апреля 2022 г.

как получить старое состояние перед обновлением состояния в State Notifier Riverpod?

Я пытаюсь использовать 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));

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...