问题描述
我正在尝试使用 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
属性
怎么做?抱歉,我是 Flutter 新手
解决方法
读取之前的状态并使用该值来定义新状态。
state = AsyncValue.data(
CitiesState(
selectedCity: state.data!.value.selectedCity,cities: latestCities,),);
使用像 freezed 这样的包可以让这一切变得更加简单。
@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));