我正在创建一个网站,并希望拥有像 SliverAppBar 或带有图像轮播的 SliverPersistentHeader。我完全可以做到,但我不希望图像轮播在我向下滚动时缩小。相反,我希望 SliverAppBar 消失,但宽度不会变小,而只是高度变小。我希望我的问题很清楚。如果有任何问题,请提出。这是我的代码:
import 'package:flutter/material.dart';
import 'package:flutter_app/Widgets/HomePageWidgets/ImageCarousel.dart';
import '../Widgets/GlobalWidgets/TopNavBar.dart';
//import 'package:flutter_app/Widgets/HomePageWidgets/HomePageImage.dart';
import '../Widgets/GlobalWidgets/BottomBar.dart';
import '../Widgets/HomePageWidgets/ImageCarousel.dart';
import '../Widgets/GlobalWidgets/OneCard.dart';
import '../Widgets/GlobalWidgets/TwoCards.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var screenSize = MediaQuery.of(context).size;
return Material(
child: Container(
child: CustomScrollView (
slivers: [
// HomePageImage(), //wurde durch ImageCarousel() ersetzt
SliverAppBar(
expandedHeight: screenSize.height * 0.9,
backgroundColor: Colors.white.withOpacity(1),
flexibleSpace: ImageCarousel(), // AUTOPLAY MUSS ANGESTELLT WERDEN,
),
SliverList(delegate: SliverChildListDelegate([
//ImageCarousel(), // AUTOPLAY MUSS ANGESTELLT WERDEN
Expanded(
child: Container(
child: Row(
// Die Row mache ich nur hin, damit ich die Seite zentrieren kann. Wenn alles nach links soll, dann einfach Row entfernen
mainAxisAlignment: MainAxisAlignment.center,
children: [
TopNavBar(),
],
),
),
), //TopNavBar // TODO 1: DropDownButton muss noch erstellt werden // TODO 2: Funktionen zu den Buttons müssen hinzufügt werden
OneCard(),
Container(height: 1000,
width: 500,),
BottomBar(), // TODO 3: Funktionen zu den Buttons müssen hinzufügt werden
]))
],
),
),
);
}
}
这是我的图像轮播:
import 'package:flutter/material.dart';
import 'package:carousel_slider/carousel_slider.dart';
// https://pub.dev/packages/carousel_slider Link zum Package
class ImageCarousel extends StatefulWidget {
@override
_ImageCarouselState createState() => _ImageCarouselState();
}
class _ImageCarouselState extends State<ImageCarousel> {
List imgList = [
'assets/images/Mathildedoppelt.jpeg',
'assets/images/reveuse2.jpeg',
];
@override
Widget build(BuildContext context) {
var screenSize = MediaQuery.of(context).size;
final double height = MediaQuery.of(context).size.height;
return CarouselSlider(
options: CarouselOptions(
height: screenSize.height * 0.9, //Ich kann hier einfach * 1.2 rechnen und dann füllt es den ganzen Bildschirm aus
aspectRatio: 16/9,
viewportFraction: 1,
initialPage: 0,
enableInfiniteScroll: true,
reverse: false,
autoPlay: false, // AUTOPLAY MUSS UNBEDINGT AN
autoPlayInterval: Duration(seconds: 6),
autoPlayAnimationDuration: Duration(seconds: 3),
enlargeCenterPage: false,
scrollDirection: Axis.horizontal,
),
items: imgList
.map((item) => Container(
child: Center(
child: Image.network(
item,
fit: BoxFit.cover,
height: height,
)),
))
.toList(),
);
}
}
这是带有 SliverPersistentHeader 的代码:
import 'package:flutter/material.dart';
import 'package:flutter_app/Widgets/HomePageWidgets/ImageCarousel.dart';
import '../Widgets/GlobalWidgets/TopNavBar.dart';
//import 'package:flutter_app/Widgets/HomePageWidgets/HomePageImage.dart';
import '../Widgets/GlobalWidgets/BottomBar.dart';
import '../Widgets/HomePageWidgets/ImageCarousel.dart';
import '../Widgets/GlobalWidgets/OneCard.dart';
import '../Widgets/GlobalWidgets/TwoCards.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var screenSize = MediaQuery.of(context).size;
return Material(
child: Container(
child: CustomScrollView (
slivers: [
// HomePageImage(), //wurde durch ImageCarousel() ersetzt
/*SliverAppBar(
expandedHeight: screenSize.height * 0.9,
backgroundColor: Colors.white.withOpacity(1),
flexibleSpace: ImageCarousel(), // AUTOPLAY MUSS ANGESTELLT WERDEN,
),*/
SliverPersistentHeader(
delegate: MyDynamicHeader(),
),
SliverList(delegate: SliverChildListDelegate([
//ImageCarousel(), // AUTOPLAY MUSS ANGESTELLT WERDEN
Expanded(
child: Container(
child: Row(
// Die Row mache ich nur hin, damit ich die Seite zentrieren kann. Wenn alles nach links soll, dann einfach Row entfernen
mainAxisAlignment: MainAxisAlignment.center,
children: [
TopNavBar(),
],
),
),
), //TopNavBar // TODO 1: DropDownButton muss noch erstellt werden // TODO 2: Funktionen zu den Buttons müssen hinzufügt werden
OneCard(),
SizedBox(height: 20,),
TwoCards(),
Container(height: 1000,
width: 500,),
BottomBar(), // TODO 3: Funktionen zu den Buttons müssen hinzufügt werden
]))
],
),
),
);
}
}
class MyDynamicHeader extends SliverPersistentHeaderDelegate {
@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
return ImageCarousel();
}
@override
bool shouldRebuild(SliverPersistentHeaderDelegate _) => true;
@override
double get maxExtent => 650.0;
@override
double get minExtent => 0.0;
}