为什么“基数派生A ||基数派生B”不能按预期工作?

问题描述

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,状态为NoteState。如果我只写if(state is NoteInitial),那么代码可以编译,就像我用newNewNote编写代码一样,但是如果我同时编写,则编译器会抱怨两者都定义了The getter 'notes' isn't defined for the type 'NoteState'. 注释,这是编译器有问题,或者我做错了什么?

解决方法

如果编译器将变量类型缩小为具有这些属性的特定类型,则只能确保属性notes存在。

我猜您两种类型都具有此属性,但彼此独立吗?但是编译器不能真正知道这一点。尚未将其范围缩小到特定类型。

如果是这样,那么您可能想要创建另一个基类或接口,为它们两个都实现它,然后使if语句依赖于此。也许您的一个州是另一个州的超集,那也可以。

我要做的是我有一个称为NoteWithNotesState的抽象状态,该状态具有一个属性notes,然后NewNoteInitialNote都从中导出。然后,您if可能是if(state is NoteWithNotesState),那么您应该可以毫无问题地访问该属性。