Укладка лент Flutter CustomScrollView

Я пытаюсь создать scrollView с помощью CustomScrollView. Эффект, который мне нужен, очень похож на этот.

Мне нужно, чтобы SliverList располагался над SliverAppbar, чтобы список не занимал весь экран и не скрывал SliverAppbar. Причина, по которой я хочу это сделать, заключается в том, что мне нужно прикрепить постоянный позиционированный виджет поверх этого списка, и он не появится, если список не будет размещен над SliverAppbar.

Вот мой код.


person Omar Awamry    schedule 02.09.2018    source источник
comment
Может быть, вы могли бы взглянуть на следующий пакет, который, судя по вашей анимации, думает почти так же: pub .dartlang.org / packages / slover_fab   -  person boeledi    schedule 02.10.2018
comment
Мне нужно точно так же. Тебе, наконец, удалось это сделать?   -  person pitazzo    schedule 20.04.2019


Ответы (1)


введите описание изображения здесь

Шаг первый. Используйте ListView внутри виджета SliverAppBar. Чтобы сделать css overflow: скрытый эффект.

Шаг второй: добавьте контроллер в NestedScrollView и перемещайте кнопку при прокрутке в стеке. Плюс вычислите, где вы хотите остановить движение кнопки.

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ScrollController scrollController;
  final double expandedHight = 150.0;

  @override
  void initState() {
    super.initState();
    scrollController = new ScrollController();
    scrollController.addListener(() => setState(() {}));
  }

  @override
  void dispose() {
    scrollController.dispose();
    super.dispose();
  }

  double get top {
    double res = expandedHight;
    if (scrollController.hasClients) {
      double offset = scrollController.offset;
      if (offset < (res - kToolbarHeight)) {
        res -= offset;
      } else {
        res = kToolbarHeight;
      }
    }
    return res;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Stack(
        children: [
          NestedScrollView(
            controller: scrollController,
            headerSliverBuilder: (context, value) {
              return [
                SliverAppBar(
                  pinned: true,
                  expandedHeight: expandedHight,
                  flexibleSpace: ListView(
                    physics: const NeverScrollableScrollPhysics(),
                    children: [
                      AppBar(
                        title: Text('AfroJack'),
                        elevation: 0.0,
                      ),
                      Container(
                        color: Colors.blue,
                        height: 100,
                        alignment: Alignment.center,
                        child: RaisedButton(
                          child: Text('folow'),
                          onPressed: () => print('folow pressed'),
                        ),
                      ),
                    ],
                  ),
                ),
              ];
            },
            body: ListView.builder(
              physics: const NeverScrollableScrollPhysics(),
              itemCount: 80,
              itemBuilder: (BuildContext context, int index) {
                return Text(
                  'text_string'.toUpperCase(),
                  style: TextStyle(
                    color: Colors.white,
                  ),
                );
              },
            ),
          ),
          Positioned(
            top: top,
            width: MediaQuery.of(context).size.width,
            child: Align(
              child: RaisedButton(
                onPressed: () => print('shuffle pressed'),
                child: Text('Suffle'),
              ),
            ),
          ),
        ],
      ),
    );
  }
}
person Kherel    schedule 15.07.2019
comment
Это 90% ответа, как я уже упоминал в вопросе: мне нужен виджет, расположенный в нижней части заголовка и имеющий более высокий z-индекс, чем у списка, чтобы зеленая кнопка была такой же, как в ссылке на YouTube. - person Omar Awamry; 16.07.2019
comment
Я добавил новый шаг в ответ - person Kherel; 16.07.2019
comment
К сожалению, у меня это не сработало, поскольку, по-видимому, есть ошибка с ScrollController и NestedScrollView: github. com / flutter / flutter / issues / 40971 - person Daniel Castro Fernández; 14.04.2020
comment
@ DanielCastroFernández Ваш случай сильно отличается, откройте новый вопрос и добавьте ссылку на него здесь .. Я постараюсь решить его. - person Kherel; 15.04.2020