Browse Source

Added pull to refresh

tmp v2.3.0
Dan Cojocaru 3 years ago
parent
commit
a955ecbfc0
Signed by: kbruen
GPG Key ID: 818A889458EDC937
  1. 3
      CHANGELOG.TXT
  2. 38
      lib/components/sliver_persistent_header_padding.dart
  3. 4
      lib/pages/train_info_page/view_train/train_info.dart
  4. 227
      lib/pages/train_info_page/view_train/train_info_cupertino.dart
  5. 4
      lib/pages/train_info_page/view_train/train_info_cupertino_DisplayTrainStation.dart
  6. 122
      lib/pages/train_info_page/view_train/train_info_material.dart
  7. 2
      pubspec.yaml

3
CHANGELOG.TXT

@ -1,3 +1,6 @@
v2.3.0
Added pull to refresh
v2.2.0 v2.2.0
Added refresh button on error Added refresh button on error

38
lib/components/sliver_persistent_header_padding.dart

@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
class SliverPersistentHeaderPadding extends StatelessWidget {
final double maxHeight;
const SliverPersistentHeaderPadding({required this.maxHeight});
@override
Widget build(BuildContext context) {
return SliverPersistentHeader(
delegate: _SliverPersistentHeaderPaddingDelegate(maxHeight: maxHeight,),
floating: false,
pinned: false,
);
}
}
class _SliverPersistentHeaderPaddingDelegate extends SliverPersistentHeaderDelegate {
final double maxHeight;
const _SliverPersistentHeaderPaddingDelegate({required this.maxHeight});
@override
Widget build(BuildContext context, double shrinkOffset, bool overlapsContent) {
return Container();
}
@override
double get maxExtent => maxHeight;
@override
double get minExtent => 0;
@override
bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
return oldDelegate.maxExtent != maxExtent;
}
}

4
lib/pages/train_info_page/view_train/train_info.dart

@ -36,7 +36,7 @@ class TrainInfo extends StatelessWidget {
return TrainInfoErrorMaterial(title: '$trainNumber - Error', error: snapshot.error!, refresh: refresh,); return TrainInfoErrorMaterial(title: '$trainNumber - Error', error: snapshot.error!, refresh: refresh,);
} }
return TrainInfoMaterial(trainData: snapshot.data!,); return TrainInfoMaterial(trainData: snapshot.data!, refresh: refresh,);
case UiDesign.CUPERTINO: case UiDesign.CUPERTINO:
if ([RefreshFutureBuilderState.none, RefreshFutureBuilderState.waiting].contains(snapshot.state)) { if ([RefreshFutureBuilderState.none, RefreshFutureBuilderState.waiting].contains(snapshot.state)) {
return TrainInfoLoadingCupertino(title: trainNumber.toString(),); return TrainInfoLoadingCupertino(title: trainNumber.toString(),);
@ -45,7 +45,7 @@ class TrainInfo extends StatelessWidget {
return TrainInfoErrorCupertino(title: '$trainNumber - Error', error: snapshot.error!, refresh: refresh,); return TrainInfoErrorCupertino(title: '$trainNumber - Error', error: snapshot.error!, refresh: refresh,);
} }
return TrainInfoCupertino(trainData: snapshot.data!,); return TrainInfoCupertino(trainData: snapshot.data!, refresh: refresh,);
default: default:
throw UnmatchedUiDesignException(uiDesign); throw UnmatchedUiDesignException(uiDesign);
} }

227
lib/pages/train_info_page/view_train/train_info_cupertino.dart

@ -1,5 +1,8 @@
import 'dart:math';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:info_tren/components/cupertino_divider.dart'; import 'package:info_tren/components/cupertino_divider.dart';
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
import 'package:info_tren/models/train_data.dart' hide State; import 'package:info_tren/models/train_data.dart' hide State;
import 'package:info_tren/models/ui_design.dart'; import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/train_info_page/train_info_constants.dart'; import 'package:info_tren/pages/train_info_page/train_info_constants.dart';
@ -58,8 +61,9 @@ class TrainInfoErrorCupertino extends TrainInfoError {
class TrainInfoCupertino extends StatelessWidget { class TrainInfoCupertino extends StatelessWidget {
final TrainData trainData; final TrainData trainData;
final Future Function()? refresh;
TrainInfoCupertino({required this.trainData}); TrainInfoCupertino({required this.trainData, this.refresh,});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -74,84 +78,153 @@ class TrainInfoCupertino extends StatelessWidget {
builder: (context) { builder: (context) {
final topPadding = MediaQuery.of(context).padding.top; final topPadding = MediaQuery.of(context).padding.top;
return CustomScrollView( return NestedScrollView(
slivers: <Widget>[ headerSliverBuilder: (context, innerBoxIsScrolled) {
SliverToBoxAdapter( return [
child: Padding( // SliverPadding(
padding: EdgeInsets.only( // padding: EdgeInsets.only(
top: topPadding, // top: topPadding,
), // ),
child: Container(), // ),
), SliverPersistentHeaderPadding(maxHeight: topPadding,)
), ];
DisplayTrainID(trainData: trainData,), },
DisplayTrainOperator(trainData: trainData,), body: Builder(
DisplayTrainRoute(trainData: trainData,), builder: (context) {
DisplayTrainDeparture(trainData: trainData,), return CustomScrollView(
SliverToBoxAdapter( slivers: <Widget>[
child: CupertinoDivider( if (refresh != null)
color: FOREGROUND_WHITE, CupertinoSliverRefreshControl(
), builder: (context, mode, pulledExtent, refreshTriggerPullDistance, refreshIndicatorExtent) {
), return Column(
DisplayTrainLastInfo(trainData: trainData,), mainAxisSize: MainAxisSize.min,
SliverToBoxAdapter( children: [
child: CupertinoDivider(), Container(
), height: pulledExtent,
SliverToBoxAdapter( child: Column(
child: IntrinsicHeight( children: [
child: Row( Container(
children: <Widget>[ height: min(refreshIndicatorExtent, pulledExtent),
// Expanded( child: Center(
// child: DisplayTrainNextStop(trainData: trainData,), child: Builder(
// ), builder: (context) {
Expanded( if (mode == RefreshIndicatorMode.inactive) {
child: DisplayTrainDestination(trainData: trainData,), return Container();
}
else if (mode == RefreshIndicatorMode.done) {
return Text('Refreshed!');
}
else if (mode == RefreshIndicatorMode.drag) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
CupertinoActivityIndicator(animating: false,),
Text('Pull to refresh...'),
],
);
}
else if (mode == RefreshIndicatorMode.armed) {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
CupertinoActivityIndicator(animating: false,),
Text('Release to refresh...'),
],
);
}
else {
return Row(
mainAxisSize: MainAxisSize.min,
children: [
CupertinoActivityIndicator(),
Text('Refreshing'),
],
);
}
},
),
),
),
Expanded(child: Container(),),
],
),
),
],
);
},
onRefresh: refresh,
), ),
SizedBox( DisplayTrainID(trainData: trainData,),
height: double.infinity, DisplayTrainOperator(trainData: trainData,),
child: CupertinoVerticalDivider(), DisplayTrainRoute(trainData: trainData,),
DisplayTrainDeparture(trainData: trainData,),
SliverToBoxAdapter(
child: CupertinoDivider(
color: FOREGROUND_WHITE,
), ),
Expanded(child: DisplayTrainRouteDistance(trainData: trainData,),), ),
], DisplayTrainLastInfo(trainData: trainData,),
), SliverToBoxAdapter(
), child: CupertinoDivider(),
), ),
// SliverToBoxAdapter( SliverToBoxAdapter(
// child: CupertinoDivider(), child: IntrinsicHeight(
// ), child: Row(
// SliverToBoxAdapter( children: <Widget>[
// child: IntrinsicHeight( // Expanded(
// child: Row( // child: DisplayTrainNextStop(trainData: trainData,),
// children: <Widget>[ // ),
// // Expanded( Expanded(
// // child: DisplayTrainRouteDuration(trainData: trainData,), child: DisplayTrainDestination(trainData: trainData,),
// // ), ),
// Expanded(child: Container(),), SizedBox(
// SizedBox( height: double.infinity,
// height: double.infinity, child: CupertinoVerticalDivider(),
// child: CupertinoVerticalDivider(), ),
// ), Expanded(child: DisplayTrainRouteDistance(trainData: trainData,),),
// Expanded( ],
// child: DisplayTrainRouteDistance(trainData: trainData,), ),
// ) ),
// ], ),
// ), // SliverToBoxAdapter(
// ), // child: CupertinoDivider(),
// ), // ),
SliverToBoxAdapter( // SliverToBoxAdapter(
child: CupertinoDivider( // child: IntrinsicHeight(
color: FOREGROUND_WHITE, // child: Row(
), // children: <Widget>[
), // // Expanded(
DisplayTrainStations( // // child: DisplayTrainRouteDuration(trainData: trainData,),
trainData: trainData, // // ),
), // Expanded(child: Container(),),
SliverToBoxAdapter( // SizedBox(
child: Container( // height: double.infinity,
height: MediaQuery.of(context).viewPadding.bottom, // child: CupertinoVerticalDivider(),
), // ),
), // Expanded(
], // child: DisplayTrainRouteDistance(trainData: trainData,),
// )
// ],
// ),
// ),
// ),
SliverToBoxAdapter(
child: CupertinoDivider(
color: FOREGROUND_WHITE,
),
),
DisplayTrainStations(
trainData: trainData,
),
SliverToBoxAdapter(
child: Container(
height: MediaQuery.of(context).viewPadding.bottom,
),
),
],
);
}
),
); );
} }
), ),

4
lib/pages/train_info_page/view_train/train_info_cupertino_DisplayTrainStation.dart

@ -264,7 +264,7 @@ class ArrivalTime extends StatelessWidget {
final now = DateTime.now(); final now = DateTime.now();
final oldDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]); final oldDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]);
final newDate = oldDate.subtract(Duration(minutes: delay)); final newDate = oldDate.add(Duration(minutes: delay));
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -398,7 +398,7 @@ class DepartureTime extends StatelessWidget {
final now = DateTime.now(); final now = DateTime.now();
final oldDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]); final oldDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]);
final newDate = oldDate.subtract(Duration(minutes: delay)); final newDate = oldDate.add(Duration(minutes: delay));
return Column( return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,

122
lib/pages/train_info_page/view_train/train_info_material.dart

@ -59,8 +59,9 @@ bool isSmallScreen(BuildContext context) => MediaQuery.of(context).size.height <
class TrainInfoMaterial extends StatelessWidget { class TrainInfoMaterial extends StatelessWidget {
final TrainData trainData; final TrainData trainData;
final Future Function()? refresh;
TrainInfoMaterial({required this.trainData}); TrainInfoMaterial({required this.trainData, this.refresh,});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -80,69 +81,72 @@ class TrainInfoMaterial extends StatelessWidget {
Expanded( Expanded(
child: SafeArea( child: SafeArea(
bottom: false, bottom: false,
child: CustomScrollView( child: RefreshIndicator(
slivers: <Widget>[ onRefresh: refresh ?? () async {},
SliverToBoxAdapter( child: CustomScrollView(
child: DisplayTrainID(trainData: trainData,), slivers: <Widget>[
), SliverToBoxAdapter(
SliverToBoxAdapter( child: DisplayTrainID(trainData: trainData,),
child: DisplayTrainOperator(trainData: trainData,),
),
SliverPadding(
padding: const EdgeInsets.only(left: 2, right: 2),
sliver: SliverToBoxAdapter(
child: DisplayTrainRoute(trainData: trainData,),
), ),
), SliverToBoxAdapter(
SliverToBoxAdapter( child: DisplayTrainOperator(trainData: trainData,),
child: DisplayTrainDeparture(trainData: trainData,), ),
), SliverPadding(
// SliverToBoxAdapter( padding: const EdgeInsets.only(left: 2, right: 2),
// child: Divider( sliver: SliverToBoxAdapter(
// color: Colors.white70, child: DisplayTrainRoute(trainData: trainData,),
// height: isSmallScreen(context) ? 8 : 16,
// ),
// ),
SliverToBoxAdapter(
child: DisplayTrainLastInfo(trainData: trainData,),
),
SliverToBoxAdapter(
child: IntrinsicHeight(
child: Row(
children: <Widget>[
// Expanded(child: DisplayTrainNextStop(trainData: trainData,)),
Expanded(child: DisplayTrainDestination(trainData: trainData,)),
Expanded(child: DisplayTrainRouteDistance(trainData: trainData,),),
],
), ),
), ),
), SliverToBoxAdapter(
// SliverToBoxAdapter( child: DisplayTrainDeparture(trainData: trainData,),
// child: IntrinsicHeight(
// child: Row(
// children: <Widget>[
// // Expanded(child: DisplayTrainRouteDuration(trainData: trainData,)),
// Expanded(child: Container(),),
// Expanded(child: DisplayTrainRouteDistance(trainData: trainData,)),
// ],
// ),
// ),
// ),
SliverToBoxAdapter(
child: Divider(
color: Colors.white70,
height: isSmallScreen(context) ? 8 : 16,
), ),
), // SliverToBoxAdapter(
DisplayTrainStations( // child: Divider(
trainData: trainData, // color: Colors.white70,
), // height: isSmallScreen(context) ? 8 : 16,
SliverToBoxAdapter( // ),
child: Container( // ),
height: MediaQuery.of(context).viewPadding.bottom, SliverToBoxAdapter(
child: DisplayTrainLastInfo(trainData: trainData,),
), ),
), SliverToBoxAdapter(
], child: IntrinsicHeight(
child: Row(
children: <Widget>[
// Expanded(child: DisplayTrainNextStop(trainData: trainData,)),
Expanded(child: DisplayTrainDestination(trainData: trainData,)),
Expanded(child: DisplayTrainRouteDistance(trainData: trainData,),),
],
),
),
),
// SliverToBoxAdapter(
// child: IntrinsicHeight(
// child: Row(
// children: <Widget>[
// // Expanded(child: DisplayTrainRouteDuration(trainData: trainData,)),
// Expanded(child: Container(),),
// Expanded(child: DisplayTrainRouteDistance(trainData: trainData,)),
// ],
// ),
// ),
// ),
SliverToBoxAdapter(
child: Divider(
color: Colors.white70,
height: isSmallScreen(context) ? 8 : 16,
),
),
DisplayTrainStations(
trainData: trainData,
),
SliverToBoxAdapter(
child: Container(
height: MediaQuery.of(context).viewPadding.bottom,
),
),
],
),
), ),
), ),
), ),

2
pubspec.yaml

@ -11,7 +11,7 @@ description: O aplicație de vizualizare a datelor puse la dispoziție de Inform
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 2.2.0 version: 2.3.0
environment: environment:
sdk: ">=2.12.0 <3.0.0" sdk: ">=2.12.0 <3.0.0"

Loading…
Cancel
Save