我有一个在ListView
和ReorderableListView
之间切换的视图。
Widget _buildList(
BuildContext context,
List<ExerciseTemplate> exerciseTemplates,
EditWorkoutModel dao,
) {
if (_isInEditingMode) {
return ReorderableListView(
key: ObjectKey('reordeableListView'),
onReorder: ((oldIndex, newIndex) {
dao.reorderIndexes(
oldIndex,
(oldIndex < newIndex) ? newIndex - 1 : newIndex,
);
}),
padding: const EdgeInsets.only(bottom: 120),
children: [
for (var exerciseTemplate in exerciseTemplates)
Provider(
key: ObjectKey('${exerciseTemplate.id}_compactExerciseTemplateRow_provider'),
create: (context) => EditExerciseModel(exerciseTemplate),
child: CompactExerciseTemplateRow(
key: ObjectKey('${exerciseTemplate.id}_compactExerciseTemplateRow'),
),
),
],
);
} else {
return ListView.builder(
key: ObjectKey('listView'),
itemCount: exerciseTemplates.length,
padding: const EdgeInsets.only(bottom: 120),
itemBuilder: (BuildContext context, int index) {
final exerciseTemplate = exerciseTemplates[index];
return Provider(
// Key is needed here to properly handle deleted rows in the ui.
// Without the key, deleted rows are being shown.
key: ObjectKey(
'${exerciseTemplate.id}_exerciseTemplateRow_provider'),
create: (context) => EditExerciseModel(exerciseTemplate),
child: ExerciseTemplateRow(
key: ObjectKey('${exerciseTemplate.id}_exerciseTemplateRow'),
onDelete: () async {
await dao.deleteExercise(exerciseTemplate);
return true;
},
),
);
},
);
}
}
两个列表显示相同的数据,但点击一个按钮,切换到ReorderableListView
,其中显示了不同小部件的数据,再次点击按钮切换回ListView
。
但是,来回切换会导致我无法与ListView
行中的元素交互。这个问题是在我为ListView
中的每个元素添加globalKey
后出现的。我需要这个key
来正确处理删除行,所以我不能只是再次删除key
。
如何才能使其工作,在切换到ReorderableListView
并返回到ListView
后,我可以与行中的小部件交互?
1条答案
按热度按时间gcuhipw91#
从提供商文档复制:https://pub.dev/packages/provider
不要用随时间变化的变量创建对象。
在这种情况下,对象将永远不会在值更改时更新。
如果要将可能随时间更改的变量传递给对象,请考虑使用ProxyProvider:
可以使用Global键并在
ListView
和ReorderableListView
之间切换,请参见以下示例:https://dartpad.dev/?id=fd39a89b67448d86e682dd2c5ec77453