Image 颤振:图像未更新
我正在做一个关于颤振的学校项目,它有一个卡片列表视图。卡上有一个图像,存储在地图中。 映射是这张Image 颤振:图像未更新,image,flutter,dart,Image,Flutter,Dart,我正在做一个关于颤振的学校项目,它有一个卡片列表视图。卡上有一个图像,存储在地图中。 映射是这张map\u imgMap,键是_objectList上的name属性,这是一个动态列表。我将图像传递给另一个名为Loader的类,它是一个有状态的小部件,在图像加载时返回一个带有circularProgress指示符的容器,并在完成后返回图像 ListView.builder( itemCount: _objectList.length, itemBuilder: (context,index){
map\u imgMap
,键是_objectList上的name属性,这是一个动态列表。我将图像传递给另一个名为Loader的类,它是一个有状态的小部件,在图像加载时返回一个带有circularProgress指示符的容器,并在完成后返回图像
ListView.builder(
itemCount: _objectList.length,
itemBuilder: (context,index){
return Card(
...
Row(
children<Widget>[
Container(child: Loader(image: _imgMap[_objectList[index].name]))
]
...
Loader Class:
class Loader extends StatefulWidget {
Image image;
Loader({Key key,this.image}) : super(key : key);
@override
_LoaderState createState() => _LoaderState(image);
}
class _LoaderState extends State<Loader> {
Image _image;
bool wait=true;
_LoaderState(this._image);
void initState(){
_image.image.resolve(ImageConfiguration()).addListener(
ImageStreamListener(
(info, call) {
setState(() {
wait = false;
});
},
),
);
}
@override
Widget build(BuildContext context) {
return wait ?CircleAvatar(
backgroundColor: Colors.transparent,
radius: 50,
child: simpleCircleLoading() //this is the circleprogress widget,
): Image(image: _image.image);
}
}
ListView.builder(
itemCount:_objectList.length,
itemBuilder:(上下文,索引){
回程卡(
...
划船(
孩子们[
容器(子:加载器(图像:_imgMap[_objectList[index].name]))
]
...
装载机类别:
类加载器扩展StatefulWidget{
图像;
加载器({Key-Key,this.image}):超级(Key:Key);
@凌驾
_LoaderState createState()=>\u LoaderState(图像);
}
类_LoaderState扩展状态{
图像(u图像),;
bool wait=true;
_装载机状态(此图像);
void initState(){
_image.image.resolve(ImageConfiguration()).addListener(
ImageStreamListener(
(信息,电话){
设置状态(){
等待=错误;
});
},
),
);
}
@凌驾
小部件构建(构建上下文){
返回等待?CircleAvatar(
背景颜色:颜色。透明,
半径:50,
child:simplecrceloading()//这是circleprogress小部件,
):Image(Image:_Image.Image);
}
}
它第一次工作正常,显示了正确的图像。但是在添加了一个搜索功能,允许用户按名称搜索,然后仅使用匹配的图像更新列表后,生成的图像是错误的
void search(String value) {
if(value.isNotEmpty){
List<dynamic> result = List<dynamic>();
_backUp.forEach((obj) { //_backup is the complete list of objects, will not change
if(obj.name.toLowerCase().contains(value.toLowerCase())) {
result.add(obj);
}
});
setState(() {
_objectList = result;
});
}else {
setState(() {
_objectList = _backUp;
});
}
}
void搜索(字符串值){
if(value.isNotEmpty){
列表结果=列表();
_forEach((obj){//\u backUp是对象的完整列表,不会更改
if(obj.name.toLowerCase().contains(value.toLowerCase())){
结果:添加(obj);
}
});
设置状态(){
_objectList=结果;
});
}否则{
设置状态(){
_objectList=\u备份;
});
}
}
示例:
正如您所看到的,卡上的信息正在更新,但图像没有更新。问题出在加载程序类的某个地方,我想,因为用图像小部件替换listview中的加载程序可以修复错误,但我想显示加载程序。发现错误,我必须向加载程序类传递一个UniqueKey