Как определить объект в состоянии приложения редукционного флаттера и получить доступ к свойствам? - PullRequest
0 голосов
/ 10 февраля 2019

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

@immutable
class AppState {
  final bool isLoading;
  final int bottomNavIndex;
  final Poscomp poscomp;

  AppState({this.isLoading = false, this.poscomp, this.bottomNavIndex});

  factory AppState.loading() => AppState(
        isLoading: true,
        poscomp: Poscomp(exams: []),
        bottomNavIndex: 0,
      );

  AppState copyWith({
    bool isLoading,
    Poscomp poscomp,
    int bottomNavIndex,
  }) {
    return AppState(
      isLoading: isLoading ?? this.isLoading,
      poscomp: poscomp ?? this.poscomp,
      bottomNavIndex: bottomNavIndex ?? this.bottomNavIndex,
    );
  }
}

Определение Poscomp:

@immutable
class Poscomp {
  final List<Exam> exams;

  Poscomp({this.exams = const []});

  Poscomp copyWith({List<Exam> exams}) {
    return Poscomp(
      exams: exams ?? this.exams,
    );
  }

  @override
  int get hashCode => exams.hashCode;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Poscomp &&
          runtimeType == other.runtimeType &&
          exams == other.exams;

  @override
  String toString() {
    return 'Poscomp{exams: $exams}';
  }
}

Когда я пытаюсь получить доступ к другим свойствам моего состояния, оно работает нормально, но объект всегда возвращает ноль.

1 Ответ

0 голосов
/ 10 февраля 2019

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

Определить редуктор для этого объекта:

import 'package:computeiro/store/models/index.dart';
import 'package:computeiro/store/reducers/index.dart';

AppState appReducer(AppState state, action) {
  return AppState(
    isLoading: loadingReducer(state.isLoading, action),
    poscomp: poscompReducer(state.poscomp, action), //HERE
    bottomNavIndex: bottomNavReducer(state.bottomNavIndex, action),
  );
}

Определите новый конструктор для Poscomp:

factory Poscomp.init() => new Poscomp(
      exams: [Exam(question: 'What is somethine?', answer: Answer.A)]);

И вызовите его внутри AppState:

factory AppState.initial() => new AppState(
        isLoading: true,
        poscomp: Poscomp.init(),
        bottomNavIndex: 1,
      );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...