Почему «base is DerivedA || base is derivedB» не работает должным образом?

#flutter #dart #compiler-errors

#flutter #dart #ошибки компилятора

Вопрос:

 if (state is NoteInitial || state is NewNote)
              return ListView.builder(
                  itemCount: state.notes.length,
                  padding: EdgeInsets.symmetric(vertical: 10),
                  itemBuilder: (BuildContext context, int index) {
                    return _NoteCard(state.notes[index], key: UniqueKey(),);
                  });
  

NoteInitial и NewNote оба являются производными от абстрактного класса NoteState, state — это NoteState . Если я только пишу, if(state is NoteInitial) то код может компилироваться, то же самое, если я пишу его с помощью new NewNote , но если я пишу оба, компилятор жалуется, что The getter 'notes' isn't defined for the type 'NoteState'. notes определены в них обоих, это проблема с компилятором, или я делаю что-то неправильно?

Ответ №1:

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

Я предполагаю, что оба ваших типа обладают этим свойством, но независимо друг от друга? Но компилятор на самом деле не может этого знать. Это не сузило круг поисков до определенного типа.

Если это так, то вы можете захотеть создать другой базовый класс или интерфейс, реализовать его для них обоих, а затем сделать так, чтобы ваше if утверждение зависело от этого. Или, может быть, одно из ваших состояний является надмножеством другого, это тоже сработало бы.

Что я делаю, так это то, что у меня есть абстрактное состояние, называемое NoteWithNotesState , которое обладает свойством notes , а затем оба NewNote и InitialNote вытекают из этого. Тогда вы if могли бы быть if(state is NoteWithNotesState) , и тогда вы должны иметь возможность получить доступ к собственности без проблем.