如果添加到动画列表,Flutter 查找已停用小部件的祖先是不安全的

Posted

技术标签:

【中文标题】如果添加到动画列表,Flutter 查找已停用小部件的祖先是不安全的【英文标题】:Flutter Looking up a deactivated widget's ancestor is unsafe if adding to animated list 【发布时间】:2021-10-18 01:26:32 【问题描述】:

我在我的应用程序中使用AnimatedList。问题是在尝试插入项目时出现此错误:

查找已停用小部件的祖先是不安全的。

这是我的清单:

child: AnimatedList(
                        padding: EdgeInsets.zero,
                        shrinkWrap: true,
                        key: listKey,
                        initialItemCount: month.memories.length,
                        itemBuilder: (context, index, animation) 
                          return slideIt(
                            context,
                            month.memories[index],
                            index,
                            animation,
                            month,
                          );
                        ,
                      ),

现在列表在View 1 中,用户pushesView 2,他在View 2 上添加数据我在dispose 内调用Callback Function,所以如果视图我会收到通知被弹出。逻辑如下:

CupertinoScaffold.showCupertinoModalBottomSheet(
                      duration: Duration(
                        milliseconds: 350,
                      ),
                      expand: true,
                      context: context,
                      builder: (context) => AddMemoryPage(
                        memoryWasAdded: (addedMemory) 
                          if (addedMemory != null) 
                            _addMemory(context, addedMemory);
                          
                        ,
                      ),
                    );

addMemory 看起来像这样:

  _addMemory(BuildContext context, Memory memoryToAdd) 

month.memories.add(memoryToAdd);

AnimatedList.of(context).insertItem(
  month.memories.length - 1,
  duration: Duration(
    milliseconds: 500,
  ),
);

我在这里做错了什么?我也用listKey.currentState 尝试过,但这也失败了,因为。 currentState 为空。怎么走?

如果您需要更多信息,请告诉我!

【问题讨论】:

【参考方案1】:

我通过删除 callback 解决了这个问题,并在弹出第二个屏幕 (pop(context, data) 时简单地传递了一个值,然后我可以像这样检索它:

onTapped: () 
                    CupertinoScaffold.showCupertinoModalBottomSheet(
                      duration: Duration(
                        milliseconds: 350,
                      ),
                      expand: true,
                      context: context,
                      builder: (context) => AddMemoryPage(),
                    ).then(
                      (memory) 
                        if (memory is Memory) 
                          _addMemory(context, memory);
                        
                      ,
                    );
                  ,

【讨论】:

以上是关于如果添加到动画列表,Flutter 查找已停用小部件的祖先是不安全的的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:查找已停用小部件的祖先是不安全的

Flutter & Navigator & ImagePicker : 为啥我可以进入下一页?查找已停用小部件的祖先是不安全的

Flutter:如何修复页面控制器动画错误

使用提供程序和快餐栏查找已停用小部件的祖先是不安全的

未处理的异常:查找已停用小部件的祖先是不安全的。如何解决这个问题?

如何在 Beamer 上添加 gif/动画(Adobe 停用 Flash)