Flutter: Provider: потребительский виджет перестраивается с обновленными данными, но не перерисовывает ListView, содержащий элементы - PullRequest
0 голосов
/ 28 апреля 2020

Я люблю Провайдера / Потребителей, это изменило игру флаттера для меня. Тем не менее, есть редкие случаи, которые я заметил при использовании 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 не знал перекрасить.

...