У меня есть список 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)),
],
);
}
}