Провайдер в ListView не избавляется? - PullRequest
1 голос
/ 04 октября 2019

У меня есть 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, и поставщик удаляется, когда его больше нет в иерархии представлений. Означает ли это, что элементы списка не удаляются / повторно используются, что приводит к росту объектов в представлении памяти, или я что-то неправильно понял? Если это так, как я могу правильно использовать поставщика в качестве элемента списка безсталкивается с проблемой потенциальной утечки приложения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...