Flutter 颤振导航中重复的全局键错误';s动画包

Flutter 颤振导航中重复的全局键错误';s动画包,flutter,dart,flutter-layout,flutter-dependencies,flutter-animation,Flutter,Dart,Flutter Layout,Flutter Dependencies,Flutter Animation,背景:我打算使用Flatter的动画包在材质卡和另一个页面(详细信息页面)之间运行容器变换效果。要进行设置,将卡片设置到“搜索”页面中的列表中,然后打开容器,向DetailsScreen传递一个数据对象(根据卡片的索引,objectList中的对象)。见以下代码: SEARCHSCREEN ... child: ListView.builder( controller: _listController, itemCount: objectL

背景:我打算使用Flatter的动画包在材质卡和另一个页面(详细信息页面)之间运行容器变换效果。要进行设置,将卡片设置到“搜索”页面中的列表中,然后打开容器,向DetailsScreen传递一个数据对象(根据卡片的索引,objectList中的对象)。见以下代码:

SEARCHSCREEN
...
child: ListView.builder(
              controller: _listController,
              itemCount: objectList.length,
              itemBuilder: (BuildContext context, int index) {
                return OpenContainer(
                  transitionDuration: Duration(milliseconds: 750),
                  closedBuilder: (_, openContainer) {
                    return AnimatedCard(
                      direction: AnimatedCardDirection.left,
                      initDelay: Duration(milliseconds: 0),
                      duration: Duration(milliseconds: 500),
                      curve: Curves.easeOutBack,
                      child: ObjectCard(objectList[index],
                          savedObjectList, openContainer),
                    );
                  },
                  openBuilder: (_, closeContainer) {
                    return DetailScreen(objectList[index], closeContainer);
                  },
                );
              },
            ),

DETAILSCREEN
class DetailScreen extends StatefulWidget {
  const DetailScreen(this.object, this.closeContainer);
  final object;
  final closeContainer;

  @override
  _DetailScreenState createState() => _DetailScreenState();
}

class _DetailScreenState extends State<DetailScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
...
搜索屏幕
...
子项:ListView.builder(
控制器:_listController,
itemCount:objectList.length,
itemBuilder:(构建上下文,int索引){
返回OpenContainer(
转换持续时间:持续时间(毫秒:750),
closedBuilder:(_,openContainer){
返回动画卡(
方向:动画CardDirection.left,
initDelay:持续时间(毫秒:0),
持续时间:持续时间(毫秒:500),
曲线:Curves.easeOutBack,
子对象:对象卡(对象列表[索引],
savedObjectList,openContainer),
);
},
openBuilder:(u,closeContainer){
返回详细信息屏幕(objectList[index],closeContainer);
},
);
},
),
详细信息屏幕
类DetailScreen扩展StatefulWidget{
const DetailScreen(this.object、this.closeContainer);
最终目标;
最终封闭容器;
@凌驾
_DetailScreenState createState()=>\u DetailScreenState();
}
类_DetailScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
...
问题:无论何时单击卡,都会返回以下错误:

The widget which was currently being built when the offending call was made was:
  DetailScreen-[LabeledGlobalKey<_SearchScreenState>#b16ed]
When the exception was thrown, this was the stack:
...
═════ Exception caught by animation library ═════════════════════════════════
setState() or markNeedsBuild() called during build.
════════════════════════════════════════════════════════════════════════════════
Another exception was thrown: setState() or markNeedsBuild() called during build.
Another exception was thrown: Duplicate GlobalKey detected in widget tree.

════════ Exception caught by widgets library ═══════════════════════════════════
Duplicate GlobalKey detected in widget tree.
发出违规呼叫时当前正在构建的小部件是:
DetailScreen-[LabeledGlobalKey#b16ed]
引发异常时,这是堆栈:
...
═════ 动画库捕获到异常═════════════════════════════════
在生成过程中调用setState()或markNeedsBuild()。
════════════════════════════════════════════════════════════════════════════════
引发了另一个异常:在生成过程中调用了setState()或markNeedsBuild()。
引发了另一个异常:在小部件树中检测到重复的GlobalKey。
════════ widgets库捕获到异常═══════════════════════════════════
在小部件树中检测到重复的GlobalKey。

在尝试了许多先向每个对象的构造函数添加和传递关键点,然后向所有构造函数传递关键点的解决方案之后,什么都没有起作用。唯一能让动画起作用的是,如果我从“return DetailScreen(objectList[index],closeContainer);”中删除[index]。动画将启动,但显然不可取,因为现在没有传递任何对象,因此DetailScreen上的任何内容都不起作用。我在这里遗漏了什么?我的印象是,每次单击openContainer时,都会创建一个DetailsScreen,填充传递的对象的数据,并在使用closeContainer callba时销毁ck.在这种假设下,这应该是可行的,因为一次只存在一个屏幕,不会出现“全局键”的重复。但现在似乎不是这样。是否有什么东西需要包括在小部件链的更高层,比如我的“搜索屏幕”中您的代码示例不包括任何键(全局键或其他键)。您在哪里创建和使用此
GlobalKey
?@Nitrodon我的代码中没有明确写入的键(在SearchScreenState及其子部件中都没有提到密钥。我相信“DetailScreen-[LabeledGlobalKey#b16ed]”在错误中,是默认创建的通用键吗?是否必须显式声明全局键,以及这种实现将如何发生?我在这里还看到,在构建器中使用全局键时存在问题,我使用的是listbuilder,它本身不应该使用。这只是此包不兼容的问题吗你能忍受吗?