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

85
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: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/ui_design.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 {
final TrainData trainData;
final Future Function()? refresh;
TrainInfoCupertino({required this.trainData});
TrainInfoCupertino({required this.trainData, this.refresh,});
@override
Widget build(BuildContext context) {
@ -74,16 +78,82 @@ class TrainInfoCupertino extends StatelessWidget {
builder: (context) {
final topPadding = MediaQuery.of(context).padding.top;
return NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
// SliverPadding(
// padding: EdgeInsets.only(
// top: topPadding,
// ),
// ),
SliverPersistentHeaderPadding(maxHeight: topPadding,)
];
},
body: Builder(
builder: (context) {
return CustomScrollView(
slivers: <Widget>[
SliverToBoxAdapter(
child: Padding(
padding: EdgeInsets.only(
top: topPadding,
if (refresh != null)
CupertinoSliverRefreshControl(
builder: (context, mode, pulledExtent, refreshTriggerPullDistance, refreshIndicatorExtent) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Container(
height: pulledExtent,
child: Column(
children: [
Container(
height: min(refreshIndicatorExtent, pulledExtent),
child: Center(
child: Builder(
builder: (context) {
if (mode == RefreshIndicatorMode.inactive) {
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'),
],
);
}
},
),
child: Container(),
),
),
Expanded(child: Container(),),
],
),
),
],
);
},
onRefresh: refresh,
),
DisplayTrainID(trainData: trainData,),
DisplayTrainOperator(trainData: trainData,),
DisplayTrainRoute(trainData: trainData,),
@ -155,6 +225,9 @@ class TrainInfoCupertino extends StatelessWidget {
);
}
),
);
}
),
),
);

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 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(
mainAxisSize: MainAxisSize.min,
@ -398,7 +398,7 @@ class DepartureTime extends StatelessWidget {
final now = DateTime.now();
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(
mainAxisSize: MainAxisSize.min,

6
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 {
final TrainData trainData;
final Future Function()? refresh;
TrainInfoMaterial({required this.trainData});
TrainInfoMaterial({required this.trainData, this.refresh,});
@override
Widget build(BuildContext context) {
@ -80,6 +81,8 @@ class TrainInfoMaterial extends StatelessWidget {
Expanded(
child: SafeArea(
bottom: false,
child: RefreshIndicator(
onRefresh: refresh ?? () async {},
child: CustomScrollView(
slivers: <Widget>[
SliverToBoxAdapter(
@ -146,6 +149,7 @@ class TrainInfoMaterial extends StatelessWidget {
),
),
),
),
],
),
);

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.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 2.2.0
version: 2.3.0
environment:
sdk: ">=2.12.0 <3.0.0"

Loading…
Cancel
Save