Flutter: вкладки с вложенным ScrollView и SliverAppBar

#flutter

#flutter

Вопрос:

Если быть кратким, я хотел бы такого поведения (несколько вкладок с скрытой панелью приложений при прокрутке вниз и отображением панели приложений при прокрутке вверх), и я хотел бы сохранить позиции прокрутки для каждой вкладки:

чего я хочу

У меня уже есть все мои вкладки с контроллером прокрутки для каждой, но, если я хорошо понимаю, для реализации SliverAppBar мне нужен только один контроллер прокрутки, используемый в основном NestedScrollView , верно?

И a ScrollController может быть прикреплен только к одному ScrollView . Итак, как я могу управлять своими ScrollViews (StaggeredGridView), чтобы сохранить свои позиции прокрутки?

Я видел свойство ScrollController.positions и PrimaryScrollController класс, но я не знаю, являются ли они решениями.

Если у кого-то есть идея 🙂

Комментарии:

1. также, пожалуйста, предоставьте некоторый код, чтобы нам не нужно было начинать с нуля, чтобы помочь вам

Ответ №1:

Простым решением будет этот пакет extended_nested_scroll_view .

Вот как я реализовал желаемое поведение прокрутки (несколько вкладок с панелью приложений скрываются при прокрутке вниз и AppBar отображаются при прокрутке вверх):

(Он не отшлифован, но с ним можно работать)

 import 'package:flutter/material.dart';

class Test extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return NestedScrollView(
      headerSliverBuilder: (context, isScrolled) {
        return [SliverAppBar(
          leading: IconButton(
            icon: Icon(Icons.menu),
            onPressed: () {},
          ),
          title: Text('Pets'),
          centerTitle: false,
          actions: [
            IconButton(
              icon: Icon(Icons.share),
              onPressed: () {},
            ),
            IconButton(
              icon: Icon(Icons.search),
              onPressed: () {},
            ),
            IconButton(
              icon: Icon(Icons.pets),
              onPressed: () {},
            ),
          ],
        )];
      },
      body: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: TabBar(
            labelColor: Colors.black,
            tabs: [
              Tab(text: 'Dogs',),
              Tab(text: 'Cats'),
              Tab(text: 'Birds'),
            ],
          ),
          body: TabBarView(
            children: [
              Center(child: Icon(Icons.pets, color: Colors.blue)),
              Center(child: Icon(Icons.pets, color: Colors.green)),
              Center(child: Icon(Icons.pets, color: Colors.red)),
            ],
          ),
        ),
      )
    );
  }
}
  

Результат:

Результат

Я использовал каркас внутри NestedScrollView с помощью a SliverAppBar , с ними вы получаете практически 2 отдельных AppBar элемента и SliverAppBar скрываете их при прокрутке вверх. Чтобы сохранить позиции прокрутки каждой вкладки, я бы использовал 3 независимых ScrollController . Если вам нужна дополнительная помощь с ними, просто напишите комментарий 😉

Комментарии:

1. Большое вам спасибо, это именно то, что я хочу, и ваш пример отлично работает для простого содержимого вкладки. Но как только я заполняю вкладку прокручиваемой, панель приложений больше не скрывается. Я безуспешно пытался использовать независимые контроллеры прокрутки на своих вкладках и без них (но в любом случае мне нужны контроллеры прокрутки для моей функции «загрузки», когда пользователь прокручивает страницу вниз)

2. да, я попробовал это сам после написания этого примера для вас, на Github для этого уже есть открытая проблема, лучше всего сейчас использовать пакет, который я связал выше.

3. Вы пытались предоставить NestedScrollView и Tab с одним и тем же контроллером прокрутки? единственным недостатком было бы то, что каждая позиция прокрутки не сохраняется на tabSwitch

4. Спасибо за комментарии. Я просто попытался использовать один и тот же ScrollController для NestedScrollView и моего ScrollView. Чтобы это заработало, нам нужно находиться на вкладке без достаточного количества элементов для заполнения страницы (без прокрутки). Я проверю связанный пакет сегодня вечером, большое спасибо 🙂

5. Пока все приведенные решения не работают, поэтому я не могу принять ответ. Я только что попробовал использовать пакет extended_nested_scroll_view, но не смог заставить его работать в главной ветке flutter (мне это нужно для решения другой проблемы:/)