Flutter автоматически избавится от виджета, который выходит за пределы экрана, и когда они появятся снова, они будут восстановлены, а не восстановлены.
Таким образом, обычной практикой является сохранение состояния в высокомвиджет уровня, который содержит, по крайней мере, полный аспект бизнес-логики и не собирается утилизироваться в ближайшее время.Затем изменение состояния отображается на дочерние виджеты.
Для вашего конкретного случая простое решение: вы сохраняете информацию в родительском виджете и сопоставляете ее с картой ImageCard внутри функции сборки родительского виджета.
Добавьте к модели свойство isliked
, isfollowing
, затем
class SomeParentState extends State<SomeParent> {
List<Model> models;
//.......
@override
Widget build(BuildContext context) {
return _buildListView(models, _scrollController);
}
Widget _buildListView(List<PhotoModel> models,
ScrollController scrollController) {
return Container(
child: ListView.builder(
controller: scrollController,
itemCount: models.length,
itemBuilder: (context, int index) {
if (index == models.length - 1) {
return SpinKitThreeBounce(
color: Colors.purple,
size: 30.0,
);
} else {
return ImageCard(
models[index].regularPhotoUrl,
models[index].mediumProfilePhotoUrl,
models[index].name,
models[index].color,
models[index].isLiked,
models[index].isFollowing,
() {
setState(() {
models[index].isLiked = !models[index].isLiked;
});
},
() {
setState(() {
models[index].isFollowing = !models[index].isFollowing;
});
},
);
}
}));
}
}
class ImageCard extends StatelessWidget{
ImageCard(
//...,
this.isLiked,
this.isFollowing,
this.likeBtnClickedListener,
this.followBtnClickedListener,
)
//...
Widget build(BuildContext context){
return Card(
//.......
IconButton(
onPressed: likeBtnClickedListener,
),
IconButton(
onPressed: followBtnClickedListener,
),
)
}
}
Это должно решить вашу проблему.В любом случае, в этом методе проще получить доступ и синхронизировать данные в дочерних виджетах.
Если вам проще поддерживать живой дочерний виджет, вы можете прочитать документацию AutomaticKeepAliveClientMixin .Он остановит трепет от убийства этого виджета, когда он исчезнет из поля зрения.Но это может привести к утечке памяти.