我试图重新创建一个谷歌地图的细节底片使用颤振功能。我正在使用DraggableScrollableSheet以及CustomScrollView和SliverAppbar (虽然我很乐意使用另一种方法)。
这给了我(大部分)在滚动时想要的效果,尽管我想知道怎样才能实现sliver应用程序条在用户滚动时慢慢降低其高度,最终在minChildSize被DraggableScrollableSheet‘击中’时“隐藏”它。
下面是我的当前代码(为了简化而简化)。
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
AnimationController _controllerDetails;
Tween<Offset> _tween = Tween(begin: Offset(0, 1), end: Offset(0, 0));
@override
void initState() {
super.initState();
_controllerDetails = AnimationController(
vsync: this, duration: const Duration(milliseconds: 500));
}
bool _onScrollDetails(Notification notification) {
return true;
}
@override
void dispose() {
_controllerDetails.dispose();
super.dispose();
}
void _showDetails() async {
if (_controllerDetails.isDismissed) {
_controllerDetails.forward();
} else if (_controllerDetails.isCompleted) {
_controllerDetails.reverse();
}
}
Widget _buildDetails() {
return SizedBox.expand(
child: SlideTransition(
position: _tween.animate(_controllerDetails),
child: DraggableScrollableActuator(
child: NotificationListener(
onNotification: _onScrollDetails,
child: DraggableScrollableSheet(
minChildSize: 0.1,
initialChildSize: 0.3,
builder:
(BuildContext context, ScrollController scrollController) {
return Container(
child: CustomScrollView(
controller: scrollController,
slivers: <Widget>[
SliverAppBar(
expandedHeight: 200,
pinned: true,
floating: true,
flexibleSpace: FlexibleSpaceBar(
title: Text('Hello World'),
background: Image.network(
"https://images.pexels.com/photos/396547/pexels-photo-396547.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500",
fit: BoxFit.cover,
)),
),
SliverFillRemaining(
child: Text(
"Once the draggable sheet goes below some value (like 0.6) how can i 'parallax' reduce the expandedHeight of the sliverAppBar, then increasing it again as the user scrolls up..."),
)
],
),
);
},
),
),
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
floatingActionButton: GestureDetector(
child: FloatingActionButton(
child: AnimatedIcon(
icon: AnimatedIcons.menu_close, progress: _controllerDetails),
elevation: 5,
onPressed: _showDetails,
),
),
body: SizedBox.expand(
child: Stack(
children: <Widget>[
_buildDetails(),
],
),
),
);
}
}任何想法/代码示例将不胜感激。
发布于 2019-11-03 07:55:58
你想要达到的效果并不常见,所以很难找到一种优雅的方法来实现它。
以下是实现此效果的一种方法,即在滚动时更改expandedHeight属性:
// in the builder of DraggableScrollableSheet
double factor = scrollController.hasClients ? scrollController.position.viewportDimension / MediaQuery.of(context).size.height : 0;
// then in the SliverAppBar
expandedHeight: 200 * factor,https://stackoverflow.com/questions/58593291
复制相似问题