我有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中时释放小部件,而当Provider不在视图层次结构中时将丢弃提供程序。 这是否意味着列表项没有被处置/重用导致对象在内存视图中增长,或者我误解了什么?如果是这样,我如何正确地将提供程序用作列表项而不面临应用程序潜在泄漏的问题?