Я люблю Провайдера / Потребителей, это изменило игру флаттера для меня. Тем не менее, есть редкие случаи, которые я заметил при использовании Consumer, когда notifyListener не перерисовывает виджет. Однажды я исправил это с помощью GlobalKey для виджета, потребляющего данные, но на этот раз это не помогает.
Я хочу лучше понять Потребителя / Провайдера, поняв, почему этот конкретный виджет не в состоянии перекрашивать. У меня даже есть распечатка, которая показывает, что у виджета есть обновленные данные.
class ActivityFeedPage extends StatefulWidget {
final GlobalKey<_ActivityFeedPageState> key = GlobalKey<_ActivityFeedPageState>();
ActivityFeedPage({Key key}) : super(key: key);
@override
_ActivityFeedPageState createState() => _ActivityFeedPageState();
}
class _ActivityFeedPageState extends State<ActivityFeedPage> {
@override
Widget build(BuildContext context) {
return PageLayout(
title: 'ACTIVITY',
buttonTitle: 'extend',
buttonFunc:
Provider.of<ActivityFeed>(context, listen: false).extendActivityFeed,
child: Consumer<ActivityFeed>(
builder: (ctx, activityFeed, child) {
print('activities length = ${activityFeed.activityFeedItems}');
return ListView(
children: activityFeed.activityFeedItems,
);
},
),
);
}
}
PageLayout - простой виджет форматирования страницы, который я использую во всем приложении, и который я не хочу перестраивать.
Итак, при первом запуске есть два начальных элемента, которые рисуют правильно. Как только я «расширил» подачу, печать показывает мне, что теперь есть четыре элемента. В представлении списка все еще отображаются только первые два.
Мне любопытно, что эта проблема возникала и в прошлом с ListView. Мне интересно, есть ли у ListView уникальная эффективность, предотвращающая перестройку с новыми элементами после вызова notifyListeners ()?
Ура!
РЕДАКТИРОВАТЬ: ********************************** ********************
Я должен добавить, что этот ActivityFeedPage вложен в родительский PageView. Когда я перемещаю Потребителя до этого PageView и передаю 'activityFeed' в ActivityFeedPage в качестве аргумента, виджет перерисовывается правильно для notifyListeners ()
Это будет означать, что даже если я просматриваю ActivityFeedPage, он не является основным активным виджет на моем экране? А мой родительский PageView - самый низкий активный виджет?
Источник: я переместился прочь и вернулся к ActivityFeedPage, и были показаны новые элементы. Это дало мне подсказку, что ActivityFeedPage не знал перекрасить.