Хобрук: Ваш путь к мастерству в программировании

Событие при подключении ScrollController

Я пытаюсь отобразить виджет, когда у меня есть информация о максимальной степени прокрутки. Я могу найти это число, если назначу экземпляр ScrollController свойству controller прокручиваемого виджета.

Моя проблема в том, что ScrollController прикрепляется к прокручиваемому виджету во время сборки, поэтому я не могу использовать максимальное число прокрутки перед первой сборкой. Таким образом, я пытался отобразить пустой Container в первой сборке, а затем заменить этот пустой Container виджетом, который мне действительно нужен. Что-то вроде этого:

    _scrollController.positions.length == 0 ? new Container() : new Align(
      alignment: Alignment.center,
      child: new Container(
        width: constraints.maxWidth,
        height: 50.0,
        color: Colors.black,
      )
    )

Теперь это, конечно, не работает, потому что _scrollController.positions.length будет 0 в начале, и я нигде не вызываю setState при изменении этого значения (при подключении контроллера).
Итак, мой вопрос: Есть ли место, где я могу получать уведомления всякий раз, когда ScrollController прикрепляется к прокручиваемому виджету? Или есть лучший подход для этого?

04.04.2018

  • Зачем вам эта информация во время сборки? Вы никогда не сможете. Как build сбросить ScrollController.positions. 05.04.2018
  • @RémiRousselet Я хочу отображать какую-то тень внизу экрана, ТОЛЬКО если представление можно прокручивать вниз. Поэтому мне нужно знать текущую позицию прокрутки и максимальную степень прокрутки, чтобы проверить это, я считаю. 05.04.2018
  • Вы можете сделать это с помощью специального фрагмента внутри файла CustomScrollView. Щепки не обязательно прокручиваются. SliverAppBar - прекрасный пример. У него даже есть понятие наличия тени или отсутствия зависимости от прокрутки. 05.04.2018
  • @RémiRousselet Завтра я более подробно рассмотрю нестандартные осколки. Спасибо за информацию! 05.04.2018
  • @RémiRousselet Я взглянул на реализацию SliverAppBar и другие связанные с ней фрагменты. Это выглядит очень сложно по сравнению с тем, что я пытался сделать. Думаю, я не совсем понимаю, где полоска будет иметь размеры при построении тени. Как он может это сделать, когда не все построено? 05.04.2018

Ответы:


1

Если прокручиваемый widget.child.

@override
Widget build(BuildContext context) {
  return new NotificationListener<ScrollNotification>(
    onNotification: _handleScrollNotification,
    child: widget.child,
  );
}

bool _handleScrollNotification(ScrollNotification notification) {
  if (notification is ScrollUpdateNotification || notification is OverscrollNotification) {
    widget.child.update(notification.metrics);
  }
return false;
}

@override
void initState() {
  super.initState();
  WidgetsBinding.instance.addPostFrameCallback((_) => afterFirstLayout(context));
}

void afterFirstLayout(BuildContext context) {
  applyInitialScrollPosition();
}

void applyInitialScrollPosition() {
  ScrollController scrollControler = widget.child.controller;
  ScrollPosition position = scrollControler.position;
  ScrollNotification notification = ScrollUpdateNotification(
      metrics: FixedScrollMetrics(
          minScrollExtent: position.minScrollExtent,
          maxScrollExtent: position.maxScrollExtent,
          pixels: position.pixels,
          viewportDimension: position.viewportDimension,
          axisDirection: position.axisDirection),
      context: null,
      scrollDelta: 0.0);
_handleScrollNotification(notification);
}

Ребенок должен extends ChangeNotifier и имеет метод update:

void update(ScrollMetrics metrics) {
  assert(metrics != null);
  _lastMetrics = metrics; // Save the metrics.
  notifyListeners();
}

Все это работает только в том случае, если контроллер прокрутки был явно определен для прокручиваемого (widget.child).

10.07.2018
Новые материалы

Решения DBA Metrix
DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

Начало работы с Блум
Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...