Flutter 冻结数据与模型数据冲突
Flutter freezed data conflict with model data
我是 Flutter 的新手,按照各种指南进行学习,实际上,在自己尝试做一些简单的事情后,我发现了一个奇怪的问题,我不知道如何解决它...
这些是我的依赖项:
dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^0.12.4
json_annotation: ^3.1.1
dio: ^3.0.10
dev_dependencies:
flutter_test:
sdk: flutter
freezed: ^0.12.7
build_runner: ^1.11.1
json_serializable: ^3.5.1
我创建了一个小型 nodejs 端点 /status
,returns 一个简单的对象:{ message: 'success' }
我为 Status
创建了一个模型:
part 'status_data.g.dart';
@JsonSerializable()
class StatusData {
StatusData({
this.message,
});
String message;
factory StatusData.fromRawJson(String str) =>
StatusData.fromJson(json.decode(str));
factory StatusData.fromJson(Map<String, dynamic> json) => StatusData(
message: json['message'],
);
}
我创建了一个 Status_notifier
:
class StatusNotifier extends StateNotifier<StatusState> {
final StatusClient _statusClient;
StatusNotifier(this._statusClient) : super(StatusState());
Future<void> getStatus() async {
try {
state = StatusState.loading();
final status = await _statusClient.getStatus();
state = StatusState.loaded(status); // ERROR (see below)
} catch (e) {
state = StatusState.error(message: 'Error: $e');
}
}
}
ERROR: The argument type 'StatusData (where StatusData is defined in
/my_long_path/lib/models/status_data.dart)' can't be assigned to the
parameter type 'StatusData (where StatusData is defined in
/my_long_path/lib/application/state/status_state.freezed.dart)'.
我创建了一个 Status_state
:
出于某种原因,我的 StatusData
模型的 import
是“灰色”,未使用...看起来它正在使用来自某个生成文件的 StatusData
。 ..
@freezed
abstract class StatusState with _$StatusState {
const factory StatusState() = Initial;
const factory StatusState.loading() = Loading;
const factory StatusState.loaded(StatusData status) = StatusData;
const factory StatusState.error({String message}) = Error;
}
我创建了 Status_client
来获取数据:
class StatusClient {
Future<StatusData> getStatus() async {
Response response =
await dio.get('https://my-api.com/status');
if (response.statusCode == 200) {
StatusData status = StatusData.fromJson(response.data);
return status;
}
throw response;
}
}
最后 Status_provider
:
final statusClientProvider = Provider<StatusClient>((ref) => StatusClient());
final statusNotifierProvider = StateNotifierProvider(
(ref) => StatusNotifier(ref.watch(statusClientProvider)),
);
我还执行了命令flutter pub run build_runner serve --delete-conflicting-outputs
来生成文件。
同样在我的 UI 中,使用 Consumer
,当状态为 loaded
时,我有一个错误:
loaded: (status) => HomePageLoaded(status: status),
错误与上面写的相同...
有人可以解释我的实现有什么问题,以便我可以改进它吗?提前致谢!
更改重定向构造函数的名称
const factory StatusState.loaded(StatusData status) = StatusData;
至
const factory StatusState.loaded(StatusData status) = StatusLoaded; // or make it private _StatusData
并重新运行构建运行ner
我是 Flutter 的新手,按照各种指南进行学习,实际上,在自己尝试做一些简单的事情后,我发现了一个奇怪的问题,我不知道如何解决它...
这些是我的依赖项:
dependencies:
flutter:
sdk: flutter
flutter_riverpod: ^0.12.4
json_annotation: ^3.1.1
dio: ^3.0.10
dev_dependencies:
flutter_test:
sdk: flutter
freezed: ^0.12.7
build_runner: ^1.11.1
json_serializable: ^3.5.1
我创建了一个小型 nodejs 端点 /status
,returns 一个简单的对象:{ message: 'success' }
我为 Status
创建了一个模型:
part 'status_data.g.dart';
@JsonSerializable()
class StatusData {
StatusData({
this.message,
});
String message;
factory StatusData.fromRawJson(String str) =>
StatusData.fromJson(json.decode(str));
factory StatusData.fromJson(Map<String, dynamic> json) => StatusData(
message: json['message'],
);
}
我创建了一个 Status_notifier
:
class StatusNotifier extends StateNotifier<StatusState> {
final StatusClient _statusClient;
StatusNotifier(this._statusClient) : super(StatusState());
Future<void> getStatus() async {
try {
state = StatusState.loading();
final status = await _statusClient.getStatus();
state = StatusState.loaded(status); // ERROR (see below)
} catch (e) {
state = StatusState.error(message: 'Error: $e');
}
}
}
ERROR: The argument type 'StatusData (where StatusData is defined in /my_long_path/lib/models/status_data.dart)' can't be assigned to the parameter type 'StatusData (where StatusData is defined in /my_long_path/lib/application/state/status_state.freezed.dart)'.
我创建了一个 Status_state
:
出于某种原因,我的 StatusData
模型的 import
是“灰色”,未使用...看起来它正在使用来自某个生成文件的 StatusData
。 ..
@freezed
abstract class StatusState with _$StatusState {
const factory StatusState() = Initial;
const factory StatusState.loading() = Loading;
const factory StatusState.loaded(StatusData status) = StatusData;
const factory StatusState.error({String message}) = Error;
}
我创建了 Status_client
来获取数据:
class StatusClient {
Future<StatusData> getStatus() async {
Response response =
await dio.get('https://my-api.com/status');
if (response.statusCode == 200) {
StatusData status = StatusData.fromJson(response.data);
return status;
}
throw response;
}
}
最后 Status_provider
:
final statusClientProvider = Provider<StatusClient>((ref) => StatusClient());
final statusNotifierProvider = StateNotifierProvider(
(ref) => StatusNotifier(ref.watch(statusClientProvider)),
);
我还执行了命令flutter pub run build_runner serve --delete-conflicting-outputs
来生成文件。
同样在我的 UI 中,使用 Consumer
,当状态为 loaded
时,我有一个错误:
loaded: (status) => HomePageLoaded(status: status),
错误与上面写的相同...
有人可以解释我的实现有什么问题,以便我可以改进它吗?提前致谢!
更改重定向构造函数的名称
const factory StatusState.loaded(StatusData status) = StatusData;
至
const factory StatusState.loaded(StatusData status) = StatusLoaded; // or make it private _StatusData
并重新运行构建运行ner