一旦我开始滚动Sliver列表中SliverToBoxAdapter内的LISTVIEW,如何立即开始滚动SliverPersistentHeader

时间:2020-07-09 17:25:47

标签: flutter listview flutter-sliver flutter-pageview sliverappbar

我有一个 sliver 列表,其中有 SliverPersistentHeader 和2个 SliverToBoxAdapter

在第一个SliverToBoxAdapter中,我的行包含两个按钮“ Dishes”和“ Info”,它们在单击时会水平交换页面。

在第二个SliverToBoxAdapter中,我有一个 PageView.Builder ,它可以帮助在相应的滚动条上生成所需的页面“ Dishes”或“ info”页面。

现在的问题是,我在Dishes类中有一个ListView(暂时具有文本小部件),一旦用户开始滚动listView,它就不会滚动sliverPersistentHeader,这是可以理解的,因为我将ListView放在其中固定的SliverToBoxAdapter。我希望它以某种方式工作,即只要用户开始滚动ListView,sliverPersistentHeader就会开始滚动。

我知道SliverFixedExtentList,但是在这里我不能用它来洗碗,因为我还使用了PageView.builder,它可以水平交换页面。将单个PageView.builder放在SliverFixedExtentList中也无济于事。我希望菜类中的ListView可以用作SliverFixedExtentList。

我无法建立合适的逻辑来实现这一目标。实现它的正确方法是什么?

enter image description here

下面是代码

class ChefProfile extends StatefulWidget {
  @override
  _ChefProfileState createState() => _ChefProfileState();
}

class _ChefProfileState extends State<ChefProfile> {
  int pageViewIndex = 0;
  PageController _pgController = PageController();
  List pageContent = [ChefDishes(), ChefInfo()];

  @override
  Widget build(BuildContext context) {
    final deviceSize = MediaQuery.of(context).size;
    final user = Provider.of<User>(context);
    
     return Material(
              child: CustomScrollView(
                controller: _scrollController,
                slivers: <Widget>[
                  
                 SliverPersistentHeader(
                    delegate: ChefSliverAppBar(
                        maxExtent: deviceSize.height * 0.39,
                        minExtent: deviceSize.height * 0.26,
                        chefData: _chefData),
                    pinned: true,
                    floating: false,
                  ),
// ---------
                  SliverToBoxAdapter(
                        child: Row(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: <Widget>[
                            
                            // >>>>>>>>> D I S H E S   B U T T O N
                            InkResponse(
                              onTap: () => {
                                pageViewIndex = 0,
                                _pgController.animateToPage(
                                  pageViewIndex,
                                  duration: Duration(milliseconds: 100),
                                  curve: Curves.easeIn,
                                ),
                              },
                             child: Container(
                                ...
                                  child: Text(
                                    "Dishes",
                                    style: ...
                                 ),
                              ),
                            ),
                            Spacer(),
                            
                            // >>>>>>>>> I N F O   B U T T O N
                            InkResponse(
                              onTap: () => {
                                pageViewIndex = 1,
                                _pgController.animateToPage(
                                  pageViewIndex,
                                  duration: Duration(milliseconds: 100),
                                  curve: Curves.easeIn,
                                ),
                              },
                              child: Container(
                               ...
                                child: Center(
                                  child: Text(
                                    "Info",
                                    style: ...
                              ),
                            ),
                          ],
                        ),
                      ),
                    ),
                  ),

// ---------
                   SliverToBoxAdapter(
                    child: Container(
                      height: deviceSize.height * 0.655,
                      margin: EdgeInsets.only(top: 10),
                      child: PageView.builder(
                        
                        controller: _pgController,
                        onPageChanged: (value) => {
                          setState(() => {
                                pageViewIndex = value,
                              }),
                         
                        },
                        itemCount: pageContent.length,
                        itemBuilder: (context, pageViewIndex) {
                          return pageContent[pageViewIndex];
                        },
                      ),
                    ),
                  ),
// ---------
                ],
              ),
            );

下面是“菜肴”类,该类暂时由ListView内的文本小部件组成

import 'package:flutter/material.dart';

class ChefDishes extends StatefulWidget {
  @override
  _ChefDishesState createState() => _ChefDishesState();
}

class _ChefDishesState extends State<ChefDishes> {
  @override
  Widget build(BuildContext context) {
    //final deviceSize = MediaQuery.of(context).size;
    return ListView(
      children: <Widget>[
        Text("data1", style: TextStyle(fontSize: 30)),
        Text("data2", style: TextStyle(fontSize: 30)),
        Text("data3", style: TextStyle(fontSize: 30)),
        Text("data4", style: TextStyle(fontSize: 30)),
        Text("data5", style: TextStyle(fontSize: 30)),
        Text("data6", style: TextStyle(fontSize: 30)),
        Text("data7", style: TextStyle(fontSize: 30)),
        Text("data8", style: TextStyle(fontSize: 30)),
        Text("data9", style: TextStyle(fontSize: 30)),
        Text("data10", style: TextStyle(fontSize: 30)),
        Text("data11", style: TextStyle(fontSize: 30)),
        Text("data12", style: TextStyle(fontSize: 30)),
        Text("data13", style: TextStyle(fontSize: 30)),
        Text("data14", style: TextStyle(fontSize: 30)),
        Text("data15", style: TextStyle(fontSize: 30)),
        Text("data16", style: TextStyle(fontSize: 30)),
        Text("data17", style: TextStyle(fontSize: 30)),
        Text("data18", style: TextStyle(fontSize: 30)),
        Text("data119", style: TextStyle(fontSize: 30)),
        Text("Data20", style: TextStyle(fontSize: 30)),
      ],
    );
  }
}

0 个答案:

没有答案