У меня есть ListView
со списком (values
), содержащим ~ 600 объектов:
ListView.builder(
itemCount: values.length,
itemBuilder: (context, index) {
return ChangeNotifierProxyProvider<DatabaseRepository,
AlbumViewModel>(
initialBuilder: (context) => AlbumViewModel(album: values[index]),
builder: (context, dbRepo, vm) => vm..databaseRepository = dbRepo,
child: const AlbumEntryView(),
);
С соответствующими AlbumEntryView
class AlbumEntryView extends StatelessWidget {
const AlbumEntryView({Key key}) : super(key: key);
Widget _flagIconButton(AlbumViewModel model) {
IconData icon = model.album.flagged ? Icons.flag : Icons.outlined_flag;
return IconButton(icon: Icon(icon), onPressed: () => model.toggleFlagged());
}
@override
Widget build(BuildContext context) {
AlbumViewModel model = Provider.of(context);
return ListTile(
title: Text(model.album.title),
trailing: _flagIconButton(model),;
}
Я проверил память вмое приложение для количества ChangeNofifierProxyProvider
объектов, и оно продолжает увеличиваться, когда я прокручиваю список (оно содержит объект AlbumEntryView
).
Насколько я знаю, ListView
освобождает виджеты, когда их нет в viewPort, и поставщик удаляется, когда его больше нет в иерархии представлений. Означает ли это, что элементы списка не удаляются / повторно используются, что приводит к росту объектов в представлении памяти, или я что-то неправильно понял? Если это так, как я могу правильно использовать поставщика в качестве элемента списка безсталкивается с проблемой потенциальной утечки приложения?