Как начать прокрутку SliverPersistentHeader, как только я начну прокручивать LISTVIEW внутри SliverToBoxAdapter в списке Sliver - PullRequest
0 голосов
/ 09 июля 2020

У меня есть список slvers , внутри которого у меня есть SliverPersistentHeader и 2 SliverToBoxAdapter .

В первом SliverToBoxAdapter у меня есть строка, состоящая из две кнопки «Блюда» и «Информация», которые меняют страницы по горизонтали при нажатии.

Во втором SliverToBoxAdapter у меня есть PageView.Builder , который помогает создать желаемую страницу либо «Блюда», либо « info »на соответствующей прокрутке.

Теперь проблема в том, что у меня есть ListView внутри класса Dishes (который временно имеет текстовые виджеты), как только пользователь начинает прокручивать listView, он не прокручивает sloverPersistentHeader, что понятно, потому что я помещаю ListView в фиксированный SliverToBoxAdapter. Я хочу, чтобы он работал таким образом, чтобы sloverPersistentHeader начинал прокрутку, как только пользователь начинает прокручивать ListView.

Я знаю о SliverFixedExtentList, но я не могу использовать его здесь для блюд, потому что я также использую PageView.builder, который меняет местами страницу по горизонтали. Помещение только одного PageView.builder в SliverFixedExtentList тоже не поможет. Я хочу, чтобы класс ListView внутри блюд работал как SliverFixedExtentList.

Я не могу создать подходящий logi c для этого. Каким образом можно достичь этого?

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

Ниже приведен код

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];
                        },
                      ),
                    ),
                  ),
// ---------
                ],
              ),
            );

Ниже представлен класс «Dishes», который временно состоит из текстовых виджетов внутри 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)),
      ],
    );
  }
}

...