Как прокручивать штабелированные контейнеры с липким заголовком в Flutter?

#flutter #flutter-layout #flutter-web

#flutter #flutter-макет #flutter-web

Вопрос:

Я пытаюсь добиться прокрутки в Flutter Web, где у меня есть несколько контейнеров, которые сложены, и я использую SingleChildScrollView для прокрутки виджета. Однако, когда я прокручиваю первый контейнер, все работает нормально, но второй, который является дочерним элементом второго контейнера, реагирует на прокрутку, не завершая начальную. А также есть ли способ сделать липкий заголовок для второго контейнера. Как я могу заставить 3-й контейнер (оранжевый) прокручиваться после завершения прокрутки 2-го (синего)? Вот чего я пытаюсь добиться: https://yobithemes.com/demo/html/freda/dark-video-index.html

И вот что я получил до сих пор:

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

 class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          IntroScreen(),
          SingleChildScrollView(
            child: Container(
              child: Column(
                children: <Widget>[
                  SizedBox(
                    height: MediaQuery.of(context).size.height - 100,
                  ),
                  Container(
                    height: MediaQuery.of(context).size.height,
                    width: MediaQuery.of(context).size.width,
                    color: Colors.blue,
                    child: SingleChildScrollView(
                      child: Column(
                        children: [
                          SizedBox(
                            height: MediaQuery.of(context).size.height,
                          ),
                          Container(
                            padding: EdgeInsets.only(top: 100),
                            height: MediaQuery.of(context).size.height,
                            width: MediaQuery.of(context).size.width,
                            color: Colors.orange,
                          ),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}
 

Ответ №1:

Вы можете добиться этого с помощью sliver.

SliverToBoxAdapter заполните прозрачную область высотой экрана — высотой панели приложений.

SliverAppBar : сделайте его липким, установив плавающий и закрепив значение true

 class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          IntroScreen(),
          CustomScrollView(
            slivers: [
              SliverToBoxAdapter(
                child: Container(
                  height: MediaQuery.of(context).size.height - 50,
                ),
              ),
              SliverAppBar(
                // toolbarHeight: 50,
                floating: true,
                pinned: true,
                title: Container(
                  child: Center(child: Text('Header')),
                ),
              ),
              SliverList(
                delegate: SliverChildBuilderDelegate(
                  (context, index) => Container(
                    height: MediaQuery.of(context).size.height-50,
                    color: Colors.primaries[index % Colors.primaries.length],
                  ),
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}