Flutter 如何在颤振中保持每个列表对象的状态

Flutter 如何在颤振中保持每个列表对象的状态,flutter,dart,Flutter,Dart,我有一个web套接字,它发送带有一些数据的图像,然后将它们显示在AnimatedList中。问题是,每一个新数据进来,它都会重新加载列表中的每一项,从而重新加载每一幅图像。另外,因为图像是从base64转换的,所以无法兑现 是否有办法在AnimatedList中保留每个对象的状态,以便在添加新项目时,不会重新加载列表中的所有其他对象/图像 AnimatedList示例: AnimatedList( key:node.validListKey, 控制器:widget.scrollControlle

我有一个web套接字,它发送带有一些数据的图像,然后将它们显示在
AnimatedList
中。问题是,每一个新数据进来,它都会重新加载列表中的每一项,从而重新加载每一幅图像。另外,因为图像是从base64转换的,所以无法兑现

是否有办法在
AnimatedList
中保留每个对象的状态,以便在添加新项目时,不会重新加载列表中的所有其他对象/图像

AnimatedList
示例:

AnimatedList(
key:node.validListKey,
控制器:widget.scrollController,
填充:从LTRB(10,10,0,10)开始的边缘设置,
initialItemCount:node.data.length,
itemBuilder:(上下文、索引、动画){
返回衰减转换(
不透明度:曲线动画(
家长:动画,
曲线:间隔(0,0.2,曲线:Curves.ease)),
child:SizeTransition(
尺寸因子:
曲线动画(父对象:动画,曲线:Curves.ease),
子级:数据容器(数据[索引])
),
);
},
),
基本解码样本:

child:AspectRatio(
方面:1/1,
子级:ExtendedImage.memory(
base64.解码(data.base),
适合:BoxFit.cover,
loadStateChanged:(状态){
if(state.extendedImageLoadState==
LoadState.completed){
返回ExtendedRawImage(
image:state.extendedImageInfo?.image,
);
}
返回中心(子项:CircularProgressIndicator());
},
),
),
更新#1 问题似乎在于如何在列表中插入项目。因为我在列表的开头插入了新项,所以出于某种原因,它只为最后一个元素调用init state,而不是最近添加的元素。当我在列表末尾插入时,问题就解决了。有没有办法强制为最近添加的项而不是最后一个项调用init state

插入项目示例:

array.add(数据);
数组。插入(0,数据);
if(key.currentState!=null)
key.currentState.insertItem(0,持续时间:_insertDuation);
更新#2 因此,通过将
AnimatedList
包装到
SingleChildScrollView
内部,添加
reverse:true
shrinkWrap:true
以及在
initState
内部添加
decode
方法,我能够解决第一个问题,即图像被重新加载

SingleChildScrollView(
子项:ListView.builer(
收缩膜:对,
相反:是的,
物理学:NeverscrollableScroll物理学(),
itemBuilder:(构建上下文,int索引){
...
},
)
);
但是现在的问题是
remove
方法。当我试图从列表中删除该项时,基本小部件内容保持不变,但图像会改变一个索引。我曾尝试为每个小部件添加唯一的密钥,但这会迫使在添加数据时重新加载每个图像

\u data.removeAt(0);
如果(_validListKey.currentState!=null)
_validListKey.currentState.removeItem(
0,(上下文,动画)=>Container(),
持续时间:持续时间0);

您应该在
initState
函数(或在
initState
中触发的异步函数)中执行
base64.decode(data.base)
并缓存结果


构建函数不应该触发此解码,或者不应该运行任何有副作用的代码。现在,在每个构建中,您都在进行解码,并为
ExtendedImage
提供不同的
Uint8List
实例。如果
ExtendedImage
实现正确,则当在新的
build()
调用中为其提供相同的引用时,它不应进行任何UI更改

很可能是您的
节点.validListKey
发生了变化<代码>动画列表不会破坏列表的状态items@RémiRousselet我使用
Provider
包来管理
动画列表的状态和键(
最终节点帮助节点=Provider.of(context,listen:false);
)。这可能是个问题吗?问题是在
initState
中,我一直只得到第一个值,直到它离开屏幕。因此,所有图像都是相同的。也许问题出在其他方面,比如
。。。