Замороженная — группа закрытых классов, некоторые с полями, которых нет у других — приводит к тому, что bloc.state не может получить доступ к отсутствующим полям

#flutter-bloc #freezed

#flutter-bloc #замороженный

Вопрос:

У меня есть эти закрытые классы для состояния cubit:

 part of 'logged_out_nickname_cubit.dart';

@freezed
abstract class LoggedOutNickNameState with _$LoggedOutNickNameState {
  factory LoggedOutNickNameState.initialised(
          LoggedOutNickNameViewModel vm, String nickNameKey, FormGroup form) =
      _Initialised;
  factory LoggedOutNickNameState.submitted(LoggedOutNickNameViewModel vm) =
      _Submitted;
}
 

Вот cubit:

 import 'package:bloc/bloc.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:reactive_forms/reactive_forms.dart';
import 'package:vepo/domain/user_registration/use-cases/logged_out_use_cases/get_user_field_from_local_use_case.dart';
import 'package:vepo/presentation/modules/logged_out/logged_out_nickname/logged_out_nick_name_view_model.dart';

part 'logged_out_nickname_state.dart';
part 'logged_out_nickname_cubit.freezed.dart';

class LoggedOutNickNameCubit extends Cubit<LoggedOutNickNameState> {
  LoggedOutNickNameCubit(
      this.vm, this.nickNameKey, this.form, this.getUserFieldFromLocalUseCase)
      : super(LoggedOutNickNameState.initialised(vm, nickNameKey, form)) {
    form.control(nickNameKey).value =
        getUserFieldFromLocalUseCase.invoke(nickNameKey);

    form.markAsDirty();
  }

  void submitPressed() => emit(LoggedOutNickNameState.submitted(vm));
  void initialise() =>
      emit(LoggedOutNickNameState.initialised(vm, nickNameKey, form));

  final LoggedOutNickNameViewModel vm;
  final String nickNameKey;
  final FormGroup form;
  final GetUserFieldFromLocalUseCase getUserFieldFromLocalUseCase;
}
 

Проблема в том, что в представлении я пытаюсь получить доступ loggedOutNicknameCubit.state.form , и поскольку форма не существует ни в одном из закрытых классов, она не распознается как находящаяся в состоянии блока и не может быть использована, на мой взгляд:

Получатель ‘form’ не определен для типа ‘LoggedOutNickNameState’

Исправление заключается в добавлении поля ко всем закрытым классам, которые не используют его как обнуляемое, например:

 factory LoggedOutNickNameState.submitted(LoggedOutNickNameViewModel vm,
      {@nullable @Default(null) FormGroup form}) = _Submitted;
 

Есть ли способ отключить ошибку, которая не включает добавление поля как null в закрытый класс, который в нем не нуждается?

Ответ №1:

Вы можете использовать приведение для получения этих переменных

 (loggedOutNicknameCubit.state as _Initialised).form