Improve route animation.

This commit is contained in:
stonegate 2020-10-13 23:35:15 +08:00
parent 24861bf588
commit 974c2af18e
2 changed files with 84 additions and 119 deletions

View File

@ -85,6 +85,7 @@ class _PodcastDetailState extends State<PodcastDetail> {
bool _selectAll; bool _selectAll;
bool _selectBefore; bool _selectBefore;
bool _selectAfter; bool _selectAfter;
bool _loadEpisodes = false;
@override @override
void initState() { void initState() {
@ -97,6 +98,8 @@ class _PodcastDetailState extends State<PodcastDetail> {
_selectAll = false; _selectAll = false;
_selectAfter = false; _selectAfter = false;
_selectBefore = false; _selectBefore = false;
Future.delayed(Duration(milliseconds: 200))
.then((value) => setState(() => _loadEpisodes = true));
} }
@override @override
@ -434,57 +437,6 @@ class _PodcastDetailState extends State<PodcastDetail> {
height: 30, height: 30,
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
//SizedBox(width: 10),
// _customPopupMenu(
// tooltip: s.homeSubMenuSortBy,
// child: Container(
// height: 30,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(100.0),
// border: Border.all(color: context.primaryColorDark),
// ),
// padding: EdgeInsets.symmetric(horizontal: 10),
// child: Row(
// mainAxisSize: MainAxisSize.min,
// children: <Widget>[
// Text(s.homeSubMenuSortBy),
// SizedBox(width: 5),
// Icon(
// _reverse
// ? LineIcons.hourglass_start_solid
// : LineIcons.hourglass_end_solid,
// size: 18,
// )
// ],
// )),
// itemBuilder: [
// PopupMenuItem(
// value: 0,
// child: Row(
// children: [
// Text(s.newestFirst),
// Spacer(),
// if (!_reverse) DotIndicator()
// ],
// ),
// ),
// PopupMenuItem(
// value: 1,
// child: Row(
// children: [
// Text(s.oldestFirst),
// Spacer(),
// if (_reverse) DotIndicator()
// ],
// ),
// )
// ],
// onSelected: (value) {
// if (value == 0) {
// setState(() => _reverse = false);
// } else if (value == 1) setState(() => _reverse = true);
// },
// ),
SizedBox(width: 15), SizedBox(width: 15),
_customPopupMenu( _customPopupMenu(
tooltip: s.filter, tooltip: s.filter,
@ -858,56 +810,57 @@ class _PodcastDetailState extends State<PodcastDetail> {
child: _multiSelect child: _multiSelect
? Center() ? Center()
: _actionBar(context)), : _actionBar(context)),
FutureBuilder<List<EpisodeBrief>>( if (_loadEpisodes)
future: _getRssItem(widget.podcastLocal, FutureBuilder<List<EpisodeBrief>>(
count: _top, future: _getRssItem(widget.podcastLocal,
reverse: _reverse, count: _top,
filter: _filter,
query: _query),
builder: (context, snapshot) {
if (snapshot.hasData) {
if (_selectAll) {
_selectedEpisodes = snapshot.data;
}
if (_selectBefore) {
final index = snapshot.data
.indexOf(_selectedEpisodes.first);
if (index != 0) {
_selectedEpisodes = snapshot.data
.sublist(0, index + 1);
}
}
if (_selectAfter) {
final index = snapshot.data
.indexOf(_selectedEpisodes.first);
_selectedEpisodes =
snapshot.data.sublist(index);
}
return EpisodeGrid(
episodes: snapshot.data,
showFavorite: true,
showNumber: _filter == Filter.all &&
!_hideListened
? true
: false,
layout: _layout,
reverse: _reverse, reverse: _reverse,
episodeCount: _episodeCount, filter: _filter,
initNum: _scroll ? 0 : 12, query: _query),
multiSelect: _multiSelect, builder: (context, snapshot) {
selectedList: _selectedEpisodes ?? [], if (snapshot.hasData) {
onSelect: (value) => setState(() { if (_selectAll) {
_selectAll = false; _selectedEpisodes = snapshot.data;
_selectBefore = false; }
_selectAfter = false; if (_selectBefore) {
_selectedEpisodes = value; final index = snapshot.data
}), .indexOf(_selectedEpisodes.first);
if (index != 0) {
_selectedEpisodes = snapshot.data
.sublist(0, index + 1);
}
}
if (_selectAfter) {
final index = snapshot.data
.indexOf(_selectedEpisodes.first);
_selectedEpisodes =
snapshot.data.sublist(index);
}
return EpisodeGrid(
episodes: snapshot.data,
showFavorite: true,
showNumber: _filter == Filter.all &&
!_hideListened
? true
: false,
layout: _layout,
reverse: _reverse,
episodeCount: _episodeCount,
initNum: _scroll ? 0 : 12,
multiSelect: _multiSelect,
selectedList: _selectedEpisodes ?? [],
onSelect: (value) => setState(() {
_selectAll = false;
_selectBefore = false;
_selectAfter = false;
_selectedEpisodes = value;
}),
);
}
return SliverToBoxAdapter(
child: Center(),
); );
} }),
return SliverToBoxAdapter(
child: Center(),
);
}),
SliverList( SliverList(
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
(context, index) { (context, index) {

View File

@ -5,26 +5,38 @@ class SlideLeftRoute extends PageRouteBuilder {
final Widget page; final Widget page;
SlideLeftRoute({this.page}) SlideLeftRoute({this.page})
: super( : super(
pageBuilder: ( pageBuilder: (
context, context,
animation, animation,
secondaryAnimation, secondaryAnimation,
) => ) =>
page, page,
transitionsBuilder: ( transitionsBuilder: (
context, context,
animation, animation,
secondaryAnimation, secondaryAnimation,
child, child,
) => ) {
SlideTransition( var begin = Offset(1.0, 0.0);
position: Tween<Offset>( var end = Offset.zero;
begin: const Offset(1, 0), var curve = Curves.easeOutQuart;
end: Offset.zero, var tween =
).animate(animation), Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
child: child, var tweenSequence = TweenSequence(<TweenSequenceItem<Offset>>[
), TweenSequenceItem<Offset>(
); tween: tween,
weight: 90.0,
),
TweenSequenceItem<Offset>(
tween: ConstantTween<Offset>(Offset.zero),
weight: 10.0,
),
]);
return SlideTransition(
position: animation.drive(tweenSequence),
child: child,
);
});
} }
class SlideLeftHideRoute extends PageRouteBuilder { class SlideLeftHideRoute extends PageRouteBuilder {