Flutter 冻结数据与模型数据冲突

问题描述

我是 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,它返回一个简单的对象:{ 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');
    }
  }
}

错误:参数类型 'StatusData(其中 StatusData 定义在 /my_long_path/lib/models/status_data.dart)' 不能分配给 参数类型 'StatusData(其中 StatusData 定义在 /my_long_path/lib/application/state/status_state.freezed.dart)'。

我创建了一个 Status_state

出于某种原因,我的 import 模型的 StatusData 是“灰色”,未使用...看起来它正在使用来自某个生成文件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

并重新运行构建运行器