Compare commits

..

No commits in common. "cb380e802c750c0424f84235f4b0433e9de63f4a" and "50dd6c19c9465e04d038466be23b9adccf79b6f6" have entirely different histories.

66 changed files with 644 additions and 1992 deletions

View file

@ -1,7 +1,7 @@
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:info_tren/models.dart';
import 'package:info_tren/models/changelog_entry.dart';
import 'package:info_tren/utils/iterable_extensions.dart';
Future<List<ChangelogEntry>> getRemoteReleases() async {

View file

@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:info_tren/api/common.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/station_data.dart';
Future<StationData> getStationData(String stationName) async {
final response = await http.get(Uri.https(authority, 'v3/stations/$stationName'));

View file

@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:info_tren/api/common.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/stations_result.dart';
Future<List<StationsResult>> get stations async {
final result = await http.get(Uri.https(authority, 'v2/stations'));

View file

@ -1,6 +1,6 @@
import 'package:http/http.dart' as http;
import 'package:info_tren/api/common.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/train_data.dart';
Future<TrainData> getTrain(String trainNumber, {DateTime? date}) async {
date ??= DateTime.now();

View file

@ -2,7 +2,7 @@ import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:info_tren/api/common.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/trains_result.dart';
Future<List<TrainsResult>> get trains async {
final result = await http.get(Uri.https(authority, 'v2/trains'));

View file

@ -10,13 +10,12 @@ class MaterialBadge extends StatelessWidget {
final bool isOnTime;
final bool isDelayed;
const MaterialBadge({
MaterialBadge({
required this.text,
required this.caption,
this.isNotScheduled = false,
this.isOnTime = false,
this.isDelayed = false,
super.key,
});
@override
@ -57,7 +56,7 @@ class MaterialBadge extends StatelessWidget {
child: Center(
child: Text(
text,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 16 : 20,
fontWeight: MediaQuery.of(context).boldText ? FontWeight.w400 : FontWeight.w200,
color: MediaQuery.of(context).boldText ? Colors.white70 : foregroundColor,
@ -68,7 +67,7 @@ class MaterialBadge extends StatelessWidget {
),
Text(
caption,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: 10,
color: MediaQuery.of(context).boldText ? Colors.white70 : foregroundColor,
),
@ -87,31 +86,30 @@ class CupertinoBadge extends StatelessWidget {
final bool isOnTime;
final bool isDelayed;
const CupertinoBadge({
CupertinoBadge({
required this.text,
required this.caption,
this.isNotScheduled = false,
this.isOnTime = false,
this.isDelayed = false,
super.key,
});
@override
Widget build(BuildContext context) {
Color foregroundColor = foregroundWhite;
Color foregroundColor = FOREGROUND_WHITE;
Color? backgroundColor;
if (isNotScheduled) {
foregroundColor = const Color.fromRGBO(225, 175, 30, 1);
backgroundColor = const Color.fromRGBO(80, 40, 10, 1);
foregroundColor = Color.fromRGBO(225, 175, 30, 1);
backgroundColor = Color.fromRGBO(80, 40, 10, 1);
}
else if (isOnTime) {
foregroundColor = const Color.fromRGBO(130, 175, 65, 1);
backgroundColor = const Color.fromRGBO(40, 80, 10, 1);
foregroundColor = Color.fromRGBO(130, 175, 65, 1);
backgroundColor = Color.fromRGBO(40, 80, 10, 1);
}
else if (isDelayed) {
foregroundColor = const Color.fromRGBO(225, 75, 30, 1);
backgroundColor = const Color.fromRGBO(80, 20, 10, 1);
foregroundColor = Color.fromRGBO(225, 75, 30, 1);
backgroundColor = Color.fromRGBO(80, 20, 10, 1);
}
return Padding(
@ -138,7 +136,7 @@ class CupertinoBadge extends StatelessWidget {
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
fontSize: 20,
fontWeight: MediaQuery.of(context).boldText ? FontWeight.w400 : FontWeight.w200,
color: MediaQuery.of(context).boldText ? foregroundWhite : foregroundColor,
color: MediaQuery.of(context).boldText ? FOREGROUND_WHITE : foregroundColor,
),
textAlign: TextAlign.center,
),
@ -148,7 +146,7 @@ class CupertinoBadge extends StatelessWidget {
caption,
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(
fontSize: 12,
color: MediaQuery.of(context).boldText ? foregroundWhite : foregroundColor,
color: MediaQuery.of(context).boldText ? FOREGROUND_WHITE : foregroundColor,
),
),
],

View file

@ -4,8 +4,8 @@ import 'package:info_tren/pages/train_info_page/train_info_constants.dart';
class CupertinoDivider extends StatelessWidget {
final Color color;
const CupertinoDivider({Key? key, Color? color}):
color = color ?? foregroundDarkGrey,
CupertinoDivider({Key? key, Color? color}):
color = color ?? FOREGROUND_DARK_GREY,
super(key: key);
@override
@ -33,8 +33,8 @@ class CupertinoDivider extends StatelessWidget {
class CupertinoVerticalDivider extends StatelessWidget {
final Color color;
const CupertinoVerticalDivider({Key? key, Color? color}):
color = color ?? foregroundDarkGrey,
CupertinoVerticalDivider({Key? key, Color? color}):
color = color ?? FOREGROUND_DARK_GREY,
super(key: key);
@override

View file

@ -23,6 +23,7 @@ class CupertinoListTile extends StatelessWidget {
title!,
if (subtitle != null)
CupertinoTheme(
child: subtitle!,
data: CupertinoTheme.of(context).copyWith(
textTheme: CupertinoTextThemeData(
textStyle: TextStyle(
@ -30,7 +31,6 @@ class CupertinoListTile extends StatelessWidget {
)
)
),
child: subtitle!,
),
],
),

View file

@ -1,6 +1,6 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/utils/default_ui_design.dart';
class FutureDisplay<T> extends StatelessWidget {
@ -9,7 +9,7 @@ class FutureDisplay<T> extends StatelessWidget {
final Widget Function<T>(BuildContext context, T data) builder;
final Widget Function(BuildContext context, Object error, StackTrace? st)? errorBuilder;
const FutureDisplay({Key? key, required this.future, required this.builder, this.errorBuilder, this.uiDesign}): super(key: key);
FutureDisplay({Key? key, required this.future, required this.builder, this.errorBuilder, this.uiDesign}): super(key: key);
@override
Widget build(BuildContext context) {
@ -24,10 +24,10 @@ class FutureDisplay<T> extends StatelessWidget {
Widget loadingWidget;
switch (uiDesign) {
case UiDesign.MATERIAL:
loadingWidget = const CircularProgressIndicator();
loadingWidget = CircularProgressIndicator();
break;
case UiDesign.CUPERTINO:
loadingWidget = const CupertinoActivityIndicator();
loadingWidget = CupertinoActivityIndicator();
break;
default:
throw UnmatchedUiDesignException(uiDesign);

View file

@ -1,11 +1,11 @@
import 'package:flutter/widgets.dart';
import 'package:info_tren/components/loading/loading_cupertino.dart';
import 'package:info_tren/components/loading/loading_material.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/utils/default_ui_design.dart';
class Loading extends StatelessWidget {
static const defaultText = 'Loading...';
static const DEFAULT_TEXT = 'Loading...';
final UiDesign? uiDesign;
final String? text;
@ -16,9 +16,9 @@ class Loading extends StatelessWidget {
final uiDesign = this.uiDesign ?? defaultUiDesign;
switch (uiDesign) {
case UiDesign.MATERIAL:
return LoadingMaterial(text: text ?? defaultText,);
return LoadingMaterial(text: text ?? DEFAULT_TEXT,);
case UiDesign.CUPERTINO:
return LoadingCupertino(text: text ?? defaultText,);
return LoadingCupertino(text: text ?? DEFAULT_TEXT,);
default:
throw UnmatchedUiDesignException(uiDesign);
}
@ -27,5 +27,5 @@ class Loading extends StatelessWidget {
abstract class LoadingCommon extends StatelessWidget {
final String text;
const LoadingCommon({required this.text, super.key,});
LoadingCommon({required this.text});
}

View file

@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:info_tren/components/loading/loading.dart';
class LoadingCupertino extends LoadingCommon {
const LoadingCupertino({required super.text, super.key,});
LoadingCupertino({required String text}) : super(text: text,);
@override
Widget build(BuildContext context) {
@ -11,8 +11,8 @@ class LoadingCupertino extends LoadingCommon {
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
const Padding(
padding: EdgeInsets.all(8.0),
Padding(
padding: const EdgeInsets.all(8.0),
child: CupertinoActivityIndicator(),
),
Padding(

View file

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:info_tren/components/loading/loading.dart';
class LoadingMaterial extends LoadingCommon {
const LoadingMaterial({required super.text, super.key});
LoadingMaterial({required String text}) : super(text: text,);
@override
Widget build(BuildContext context) {
@ -11,8 +11,8 @@ class LoadingMaterial extends LoadingCommon {
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
const Padding(
padding: EdgeInsets.all(8.0),
Padding(
padding: const EdgeInsets.all(8.0),
child: CircularProgressIndicator(),
),
Padding(

View file

@ -19,7 +19,7 @@ class _RefreshFutureBuilderState<T> extends State<RefreshFutureBuilder<T>> {
@override
void initState() {
super.initState();
snapshot = widget.initialData != null ? RefreshFutureBuilderSnapshot.initial(widget.initialData as T) : const RefreshFutureBuilderSnapshot.nothing();
snapshot = widget.initialData != null ? RefreshFutureBuilderSnapshot.initial(widget.initialData!) : RefreshFutureBuilderSnapshot.nothing();
}
@override
@ -39,7 +39,7 @@ class _RefreshFutureBuilderState<T> extends State<RefreshFutureBuilder<T>> {
setState(() {
switch (snapshot.state) {
case RefreshFutureBuilderState.none:
snapshot = const RefreshFutureBuilderSnapshot.waiting();
snapshot = RefreshFutureBuilderSnapshot.waiting();
break;
case RefreshFutureBuilderState.initial:
snapshot = RefreshFutureBuilderSnapshot.refresh(snapshot.data);
@ -47,7 +47,7 @@ class _RefreshFutureBuilderState<T> extends State<RefreshFutureBuilder<T>> {
case RefreshFutureBuilderState.waiting:
return;
case RefreshFutureBuilderState.error:
snapshot = const RefreshFutureBuilderSnapshot.waiting();
snapshot = RefreshFutureBuilderSnapshot.waiting();
break;
case RefreshFutureBuilderState.done:
snapshot = RefreshFutureBuilderSnapshot.refresh(snapshot.data);

View file

@ -1,9 +1,12 @@
import 'dart:convert';
import 'package:flutter/widgets.dart';
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions_cupertino.dart';
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions_material.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/trains_result.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/utils/default_ui_design.dart';
import 'package:tuple/tuple.dart';
class SelectTrainSuggestions extends StatefulWidget {
final UiDesign? uiDesign;
@ -93,7 +96,7 @@ class OperatorAutocompleteSliver extends StatelessWidget {
return SliverPrototypeExtentList(
prototypeItem: Column(
children: <Widget>[
mapTrainToItem(const TrainsResult(company: 'Company', number: '123', rank: 'R')),
mapTrainToItem(TrainsResult(company: 'Company', number: '123', rank: 'R')),
],
),
delegate: SliverChildBuilderDelegate(

View file

@ -1,7 +1,7 @@
import 'package:flutter/cupertino.dart';
import 'package:info_tren/components/cupertino_divider.dart';
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/trains_result.dart';
class SelectTrainSuggestionsStateCupertino extends SelectTrainSuggestionsState {
@override
@ -21,14 +21,14 @@ class SelectTrainSuggestionsStateCupertino extends SelectTrainSuggestionsState {
],
)
),
const CupertinoDivider(),
CupertinoDivider(),
],
);
}
}
class OperatorAutocompleteTileCupertino extends OperatorAutocompleteTile {
const OperatorAutocompleteTileCupertino({
OperatorAutocompleteTileCupertino({
Key? key,
required String operatorName,
required void Function(String) onTrainSelected,
@ -71,7 +71,7 @@ class OperatorAutocompleteTileCupertino extends OperatorAutocompleteTile {
),
),
),
const CupertinoDivider(),
CupertinoDivider(),
],
);
}

View file

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/trains_result.dart';
class SelectTrainSuggestionsStateMaterial extends SelectTrainSuggestionsState {
@override
@ -14,14 +14,14 @@ class SelectTrainSuggestionsStateMaterial extends SelectTrainSuggestionsState {
onTrainSelected(currentInput);
},
),
const Divider(),
Divider(),
],
);
}
}
class OperatorAutocompleteTileMaterial extends OperatorAutocompleteTile {
const OperatorAutocompleteTileMaterial({
OperatorAutocompleteTileMaterial({
Key? key,
required String operatorName,
required void Function(String) onTrainSelected,

View file

@ -5,11 +5,10 @@ class SlimAppBar extends StatelessWidget {
final double size;
// final Function onBackTap;
const SlimAppBar({
SlimAppBar({
required this.title,
this.size = 24,
// this.onBackTap,
super.key,
});
@override
@ -29,11 +28,11 @@ class SlimAppBar extends StatelessWidget {
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
SizedBox(
Container(
height: size,
width: size,
child: (ModalRoute.of(context)?.canPop ?? false)
? const BackButtonIcon()
? BackButtonIcon()
: null,
),
Expanded(
@ -44,13 +43,13 @@ class SlimAppBar extends StatelessWidget {
title,
textAlign: TextAlign.center,
style:
Theme.of(context).appBarTheme.textTheme?.bodySmall?.copyWith(color: Theme.of(context).appBarTheme.textTheme?.bodyMedium?.color) ??
Theme.of(context).textTheme.bodySmall?.copyWith(color: Theme.of(context).textTheme.bodyMedium?.color),
Theme.of(context).appBarTheme.textTheme?.caption?.copyWith(color: Theme.of(context).appBarTheme.textTheme?.bodyText2?.color) ??
Theme.of(context).textTheme.caption?.copyWith(color: Theme.of(context).textTheme.bodyText2?.color),
),
),
),
),
SizedBox(
Container(
height: size,
width: size,
),

View file

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
class SliverPersistentHeaderPadding extends StatelessWidget {
final double maxHeight;
const SliverPersistentHeaderPadding({required this.maxHeight, super.key,});
const SliverPersistentHeaderPadding({required this.maxHeight});
@override
Widget build(BuildContext context) {

View file

@ -1,6 +1,10 @@
import 'dart:io' show Platform;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:info_tren/models.dart';
import 'package:flutter/services.dart';
// import 'package:flutter_redux/flutter_redux.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/about/about_page.dart';
import 'package:info_tren/pages/main/main_page.dart';
import 'package:info_tren/pages/station_arrdep_page/select_station/select_station.dart';
@ -11,8 +15,15 @@ import 'package:info_tren/pages/train_info_page/select_train/select_train.dart';
void main() {
// final store = createStore();
// runApp(
// StoreProvider(
// store: store,
// child: StartPoint(),
// )
// );
runApp(
const StartPoint(),
StartPoint(),
);
}
@ -56,8 +67,6 @@ Map<String, WidgetBuilder> routesByUiDesign(UiDesign uiDesign) => {
class StartPoint extends StatelessWidget {
final String appTitle = 'Info Tren';
const StartPoint({super.key});
@override
Widget build(BuildContext context) {
// if (Platform.isIOS || Platform.isMacOS) {

View file

@ -1,13 +0,0 @@
export 'package:info_tren/models/changelog_entry.dart';
export 'package:info_tren/models/station_arrdep.dart';
export 'package:info_tren/models/station_data.dart';
export 'package:info_tren/models/station_status.dart';
export 'package:info_tren/models/station_train.dart';
export 'package:info_tren/models/stations_result.dart';
export 'package:info_tren/models/train_data.dart' hide State;
export 'package:info_tren/models/trains_result.dart';
export 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/models/train_data.dart' show State;
typedef TrainDataState = State;

View file

@ -1,18 +0,0 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:info_tren/models.dart';
part 'station_arrdep.g.dart';
part 'station_arrdep.freezed.dart';
@freezed
class StationArrDep with _$StationArrDep {
const factory StationArrDep({
required int? stoppingTime,
required DateTime time,
required StationTrain train,
required StationStatus status,
}) = _StationArrDep;
factory StationArrDep.fromJson(Map<String, dynamic> json) => _$StationArrDepFromJson(json);
}

View file

@ -1,241 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'station_arrdep.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
StationArrDep _$StationArrDepFromJson(Map<String, dynamic> json) {
return _StationArrDep.fromJson(json);
}
/// @nodoc
mixin _$StationArrDep {
int? get stoppingTime => throw _privateConstructorUsedError;
DateTime get time => throw _privateConstructorUsedError;
StationTrain get train => throw _privateConstructorUsedError;
StationStatus get status => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$StationArrDepCopyWith<StationArrDep> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $StationArrDepCopyWith<$Res> {
factory $StationArrDepCopyWith(
StationArrDep value, $Res Function(StationArrDep) then) =
_$StationArrDepCopyWithImpl<$Res, StationArrDep>;
@useResult
$Res call(
{int? stoppingTime,
DateTime time,
StationTrain train,
StationStatus status});
$StationTrainCopyWith<$Res> get train;
$StationStatusCopyWith<$Res> get status;
}
/// @nodoc
class _$StationArrDepCopyWithImpl<$Res, $Val extends StationArrDep>
implements $StationArrDepCopyWith<$Res> {
_$StationArrDepCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? stoppingTime = freezed,
Object? time = null,
Object? train = null,
Object? status = null,
}) {
return _then(_value.copyWith(
stoppingTime: freezed == stoppingTime
? _value.stoppingTime
: stoppingTime // ignore: cast_nullable_to_non_nullable
as int?,
time: null == time
? _value.time
: time // ignore: cast_nullable_to_non_nullable
as DateTime,
train: null == train
? _value.train
: train // ignore: cast_nullable_to_non_nullable
as StationTrain,
status: null == status
? _value.status
: status // ignore: cast_nullable_to_non_nullable
as StationStatus,
) as $Val);
}
@override
@pragma('vm:prefer-inline')
$StationTrainCopyWith<$Res> get train {
return $StationTrainCopyWith<$Res>(_value.train, (value) {
return _then(_value.copyWith(train: value) as $Val);
});
}
@override
@pragma('vm:prefer-inline')
$StationStatusCopyWith<$Res> get status {
return $StationStatusCopyWith<$Res>(_value.status, (value) {
return _then(_value.copyWith(status: value) as $Val);
});
}
}
/// @nodoc
abstract class _$$_StationArrDepCopyWith<$Res>
implements $StationArrDepCopyWith<$Res> {
factory _$$_StationArrDepCopyWith(
_$_StationArrDep value, $Res Function(_$_StationArrDep) then) =
__$$_StationArrDepCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{int? stoppingTime,
DateTime time,
StationTrain train,
StationStatus status});
@override
$StationTrainCopyWith<$Res> get train;
@override
$StationStatusCopyWith<$Res> get status;
}
/// @nodoc
class __$$_StationArrDepCopyWithImpl<$Res>
extends _$StationArrDepCopyWithImpl<$Res, _$_StationArrDep>
implements _$$_StationArrDepCopyWith<$Res> {
__$$_StationArrDepCopyWithImpl(
_$_StationArrDep _value, $Res Function(_$_StationArrDep) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? stoppingTime = freezed,
Object? time = null,
Object? train = null,
Object? status = null,
}) {
return _then(_$_StationArrDep(
stoppingTime: freezed == stoppingTime
? _value.stoppingTime
: stoppingTime // ignore: cast_nullable_to_non_nullable
as int?,
time: null == time
? _value.time
: time // ignore: cast_nullable_to_non_nullable
as DateTime,
train: null == train
? _value.train
: train // ignore: cast_nullable_to_non_nullable
as StationTrain,
status: null == status
? _value.status
: status // ignore: cast_nullable_to_non_nullable
as StationStatus,
));
}
}
/// @nodoc
@JsonSerializable()
class _$_StationArrDep implements _StationArrDep {
const _$_StationArrDep(
{required this.stoppingTime,
required this.time,
required this.train,
required this.status});
factory _$_StationArrDep.fromJson(Map<String, dynamic> json) =>
_$$_StationArrDepFromJson(json);
@override
final int? stoppingTime;
@override
final DateTime time;
@override
final StationTrain train;
@override
final StationStatus status;
@override
String toString() {
return 'StationArrDep(stoppingTime: $stoppingTime, time: $time, train: $train, status: $status)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_StationArrDep &&
(identical(other.stoppingTime, stoppingTime) ||
other.stoppingTime == stoppingTime) &&
(identical(other.time, time) || other.time == time) &&
(identical(other.train, train) || other.train == train) &&
(identical(other.status, status) || other.status == status));
}
@JsonKey(ignore: true)
@override
int get hashCode =>
Object.hash(runtimeType, stoppingTime, time, train, status);
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$_StationArrDepCopyWith<_$_StationArrDep> get copyWith =>
__$$_StationArrDepCopyWithImpl<_$_StationArrDep>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$_StationArrDepToJson(
this,
);
}
}
abstract class _StationArrDep implements StationArrDep {
const factory _StationArrDep(
{required final int? stoppingTime,
required final DateTime time,
required final StationTrain train,
required final StationStatus status}) = _$_StationArrDep;
factory _StationArrDep.fromJson(Map<String, dynamic> json) =
_$_StationArrDep.fromJson;
@override
int? get stoppingTime;
@override
DateTime get time;
@override
StationTrain get train;
@override
StationStatus get status;
@override
@JsonKey(ignore: true)
_$$_StationArrDepCopyWith<_$_StationArrDep> get copyWith =>
throw _privateConstructorUsedError;
}

View file

@ -1,23 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'station_arrdep.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$_StationArrDep _$$_StationArrDepFromJson(Map<String, dynamic> json) =>
_$_StationArrDep(
stoppingTime: json['stoppingTime'] as int?,
time: DateTime.parse(json['time'] as String),
train: StationTrain.fromJson(json['train'] as Map<String, dynamic>),
status: StationStatus.fromJson(json['status'] as Map<String, dynamic>),
);
Map<String, dynamic> _$$_StationArrDepToJson(_$_StationArrDep instance) =>
<String, dynamic>{
'stoppingTime': instance.stoppingTime,
'time': instance.time.toIso8601String(),
'train': instance.train,
'status': instance.status,
};

View file

@ -1,17 +1,64 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:info_tren/models.dart';
import 'package:json_annotation/json_annotation.dart';
part 'station_data.g.dart';
part 'station_data.freezed.dart';
@freezed
class StationData with _$StationData {
const factory StationData({
required String date,
required String stationName,
required List<StationArrDep>? arrivals,
required List<StationArrDep>? departures,
}) = _StationData;
@JsonSerializable()
class StationData {
final String date;
final String stationName;
final List<StationArrDep>? arrivals;
final List<StationArrDep>? departures;
const StationData({required this.date, required this.stationName, required this.arrivals, required this.departures});
factory StationData.fromJson(Map<String, dynamic> json) => _$StationDataFromJson(json);
Map<String, dynamic> toJson() => _$StationDataToJson(this);
}
@JsonSerializable()
class StationArrDep {
final int? stoppingTime;
final DateTime time;
final StationTrain train;
final StationStatus status;
const StationArrDep({required this.stoppingTime, required this.time, required this.train, required this.status,});
factory StationArrDep.fromJson(Map<String, dynamic> json) => _$StationArrDepFromJson(json);
Map<String, dynamic> toJson() => _$StationArrDepToJson(this);
}
@JsonSerializable()
class StationTrain {
final String rank;
final String number;
final String operator;
final String terminus;
final List<String>? route;
final DateTime departureDate;
StationTrain({
required this.rank,
required this.number,
required this.operator,
required this.terminus,
this.route,
required this.departureDate,
});
factory StationTrain.fromJson(Map<String, dynamic> json) => _$StationTrainFromJson(json);
Map<String, dynamic> toJson() => _$StationTrainToJson(this);
}
@JsonSerializable()
class StationStatus {
final int delay;
final bool real;
final bool cancelled;
final String? platform;
StationStatus({required this.delay, required this.real, required this.cancelled, required this.platform});
factory StationStatus.fromJson(Map<String, dynamic> json) => _$StationStatusFromJson(json);
Map<String, dynamic> toJson() => _$StationStatusToJson(this);
}

View file

@ -1,237 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'station_data.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
StationData _$StationDataFromJson(Map<String, dynamic> json) {
return _StationData.fromJson(json);
}
/// @nodoc
mixin _$StationData {
String get date => throw _privateConstructorUsedError;
String get stationName => throw _privateConstructorUsedError;
List<StationArrDep>? get arrivals => throw _privateConstructorUsedError;
List<StationArrDep>? get departures => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$StationDataCopyWith<StationData> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $StationDataCopyWith<$Res> {
factory $StationDataCopyWith(
StationData value, $Res Function(StationData) then) =
_$StationDataCopyWithImpl<$Res, StationData>;
@useResult
$Res call(
{String date,
String stationName,
List<StationArrDep>? arrivals,
List<StationArrDep>? departures});
}
/// @nodoc
class _$StationDataCopyWithImpl<$Res, $Val extends StationData>
implements $StationDataCopyWith<$Res> {
_$StationDataCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? date = null,
Object? stationName = null,
Object? arrivals = freezed,
Object? departures = freezed,
}) {
return _then(_value.copyWith(
date: null == date
? _value.date
: date // ignore: cast_nullable_to_non_nullable
as String,
stationName: null == stationName
? _value.stationName
: stationName // ignore: cast_nullable_to_non_nullable
as String,
arrivals: freezed == arrivals
? _value.arrivals
: arrivals // ignore: cast_nullable_to_non_nullable
as List<StationArrDep>?,
departures: freezed == departures
? _value.departures
: departures // ignore: cast_nullable_to_non_nullable
as List<StationArrDep>?,
) as $Val);
}
}
/// @nodoc
abstract class _$$_StationDataCopyWith<$Res>
implements $StationDataCopyWith<$Res> {
factory _$$_StationDataCopyWith(
_$_StationData value, $Res Function(_$_StationData) then) =
__$$_StationDataCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{String date,
String stationName,
List<StationArrDep>? arrivals,
List<StationArrDep>? departures});
}
/// @nodoc
class __$$_StationDataCopyWithImpl<$Res>
extends _$StationDataCopyWithImpl<$Res, _$_StationData>
implements _$$_StationDataCopyWith<$Res> {
__$$_StationDataCopyWithImpl(
_$_StationData _value, $Res Function(_$_StationData) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? date = null,
Object? stationName = null,
Object? arrivals = freezed,
Object? departures = freezed,
}) {
return _then(_$_StationData(
date: null == date
? _value.date
: date // ignore: cast_nullable_to_non_nullable
as String,
stationName: null == stationName
? _value.stationName
: stationName // ignore: cast_nullable_to_non_nullable
as String,
arrivals: freezed == arrivals
? _value._arrivals
: arrivals // ignore: cast_nullable_to_non_nullable
as List<StationArrDep>?,
departures: freezed == departures
? _value._departures
: departures // ignore: cast_nullable_to_non_nullable
as List<StationArrDep>?,
));
}
}
/// @nodoc
@JsonSerializable()
class _$_StationData implements _StationData {
const _$_StationData(
{required this.date,
required this.stationName,
required final List<StationArrDep>? arrivals,
required final List<StationArrDep>? departures})
: _arrivals = arrivals,
_departures = departures;
factory _$_StationData.fromJson(Map<String, dynamic> json) =>
_$$_StationDataFromJson(json);
@override
final String date;
@override
final String stationName;
final List<StationArrDep>? _arrivals;
@override
List<StationArrDep>? get arrivals {
final value = _arrivals;
if (value == null) return null;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
final List<StationArrDep>? _departures;
@override
List<StationArrDep>? get departures {
final value = _departures;
if (value == null) return null;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
String toString() {
return 'StationData(date: $date, stationName: $stationName, arrivals: $arrivals, departures: $departures)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_StationData &&
(identical(other.date, date) || other.date == date) &&
(identical(other.stationName, stationName) ||
other.stationName == stationName) &&
const DeepCollectionEquality().equals(other._arrivals, _arrivals) &&
const DeepCollectionEquality()
.equals(other._departures, _departures));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(
runtimeType,
date,
stationName,
const DeepCollectionEquality().hash(_arrivals),
const DeepCollectionEquality().hash(_departures));
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$_StationDataCopyWith<_$_StationData> get copyWith =>
__$$_StationDataCopyWithImpl<_$_StationData>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$_StationDataToJson(
this,
);
}
}
abstract class _StationData implements StationData {
const factory _StationData(
{required final String date,
required final String stationName,
required final List<StationArrDep>? arrivals,
required final List<StationArrDep>? departures}) = _$_StationData;
factory _StationData.fromJson(Map<String, dynamic> json) =
_$_StationData.fromJson;
@override
String get date;
@override
String get stationName;
@override
List<StationArrDep>? get arrivals;
@override
List<StationArrDep>? get departures;
@override
@JsonKey(ignore: true)
_$$_StationDataCopyWith<_$_StationData> get copyWith =>
throw _privateConstructorUsedError;
}

View file

@ -6,8 +6,7 @@ part of 'station_data.dart';
// JsonSerializableGenerator
// **************************************************************************
_$_StationData _$$_StationDataFromJson(Map<String, dynamic> json) =>
_$_StationData(
StationData _$StationDataFromJson(Map<String, dynamic> json) => StationData(
date: json['date'] as String,
stationName: json['stationName'] as String,
arrivals: (json['arrivals'] as List<dynamic>?)
@ -18,10 +17,62 @@ _$_StationData _$$_StationDataFromJson(Map<String, dynamic> json) =>
.toList(),
);
Map<String, dynamic> _$$_StationDataToJson(_$_StationData instance) =>
Map<String, dynamic> _$StationDataToJson(StationData instance) =>
<String, dynamic>{
'date': instance.date,
'stationName': instance.stationName,
'arrivals': instance.arrivals,
'departures': instance.departures,
};
StationArrDep _$StationArrDepFromJson(Map<String, dynamic> json) =>
StationArrDep(
stoppingTime: json['stoppingTime'] as int?,
time: DateTime.parse(json['time'] as String),
train: StationTrain.fromJson(json['train'] as Map<String, dynamic>),
status: StationStatus.fromJson(json['status'] as Map<String, dynamic>),
);
Map<String, dynamic> _$StationArrDepToJson(StationArrDep instance) =>
<String, dynamic>{
'stoppingTime': instance.stoppingTime,
'time': instance.time.toIso8601String(),
'train': instance.train,
'status': instance.status,
};
StationTrain _$StationTrainFromJson(Map<String, dynamic> json) => StationTrain(
rank: json['rank'] as String,
number: json['number'] as String,
operator: json['operator'] as String,
terminus: json['terminus'] as String,
route:
(json['route'] as List<dynamic>?)?.map((e) => e as String).toList(),
departureDate: DateTime.parse(json['departureDate'] as String),
);
Map<String, dynamic> _$StationTrainToJson(StationTrain instance) =>
<String, dynamic>{
'rank': instance.rank,
'number': instance.number,
'operator': instance.operator,
'terminus': instance.terminus,
'route': instance.route,
'departureDate': instance.departureDate.toIso8601String(),
};
StationStatus _$StationStatusFromJson(Map<String, dynamic> json) =>
StationStatus(
delay: json['delay'] as int,
real: json['real'] as bool,
cancelled: json['cancelled'] as bool,
platform: json['platform'] as String?,
);
Map<String, dynamic> _$StationStatusToJson(StationStatus instance) =>
<String, dynamic>{
'delay': instance.delay,
'real': instance.real,
'cancelled': instance.cancelled,
'platform': instance.platform,
};

View file

@ -1,17 +0,0 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'station_status.g.dart';
part 'station_status.freezed.dart';
@freezed
class StationStatus with _$StationStatus {
const factory StationStatus({
required int delay,
required bool real,
required bool cancelled,
required String? platform,
}) = _StationStatus;
factory StationStatus.fromJson(Map<String, dynamic> json) => _$StationStatusFromJson(json);
}

View file

@ -1,210 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'station_status.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
StationStatus _$StationStatusFromJson(Map<String, dynamic> json) {
return _StationStatus.fromJson(json);
}
/// @nodoc
mixin _$StationStatus {
int get delay => throw _privateConstructorUsedError;
bool get real => throw _privateConstructorUsedError;
bool get cancelled => throw _privateConstructorUsedError;
String? get platform => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$StationStatusCopyWith<StationStatus> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $StationStatusCopyWith<$Res> {
factory $StationStatusCopyWith(
StationStatus value, $Res Function(StationStatus) then) =
_$StationStatusCopyWithImpl<$Res, StationStatus>;
@useResult
$Res call({int delay, bool real, bool cancelled, String? platform});
}
/// @nodoc
class _$StationStatusCopyWithImpl<$Res, $Val extends StationStatus>
implements $StationStatusCopyWith<$Res> {
_$StationStatusCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? delay = null,
Object? real = null,
Object? cancelled = null,
Object? platform = freezed,
}) {
return _then(_value.copyWith(
delay: null == delay
? _value.delay
: delay // ignore: cast_nullable_to_non_nullable
as int,
real: null == real
? _value.real
: real // ignore: cast_nullable_to_non_nullable
as bool,
cancelled: null == cancelled
? _value.cancelled
: cancelled // ignore: cast_nullable_to_non_nullable
as bool,
platform: freezed == platform
? _value.platform
: platform // ignore: cast_nullable_to_non_nullable
as String?,
) as $Val);
}
}
/// @nodoc
abstract class _$$_StationStatusCopyWith<$Res>
implements $StationStatusCopyWith<$Res> {
factory _$$_StationStatusCopyWith(
_$_StationStatus value, $Res Function(_$_StationStatus) then) =
__$$_StationStatusCopyWithImpl<$Res>;
@override
@useResult
$Res call({int delay, bool real, bool cancelled, String? platform});
}
/// @nodoc
class __$$_StationStatusCopyWithImpl<$Res>
extends _$StationStatusCopyWithImpl<$Res, _$_StationStatus>
implements _$$_StationStatusCopyWith<$Res> {
__$$_StationStatusCopyWithImpl(
_$_StationStatus _value, $Res Function(_$_StationStatus) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? delay = null,
Object? real = null,
Object? cancelled = null,
Object? platform = freezed,
}) {
return _then(_$_StationStatus(
delay: null == delay
? _value.delay
: delay // ignore: cast_nullable_to_non_nullable
as int,
real: null == real
? _value.real
: real // ignore: cast_nullable_to_non_nullable
as bool,
cancelled: null == cancelled
? _value.cancelled
: cancelled // ignore: cast_nullable_to_non_nullable
as bool,
platform: freezed == platform
? _value.platform
: platform // ignore: cast_nullable_to_non_nullable
as String?,
));
}
}
/// @nodoc
@JsonSerializable()
class _$_StationStatus implements _StationStatus {
const _$_StationStatus(
{required this.delay,
required this.real,
required this.cancelled,
required this.platform});
factory _$_StationStatus.fromJson(Map<String, dynamic> json) =>
_$$_StationStatusFromJson(json);
@override
final int delay;
@override
final bool real;
@override
final bool cancelled;
@override
final String? platform;
@override
String toString() {
return 'StationStatus(delay: $delay, real: $real, cancelled: $cancelled, platform: $platform)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_StationStatus &&
(identical(other.delay, delay) || other.delay == delay) &&
(identical(other.real, real) || other.real == real) &&
(identical(other.cancelled, cancelled) ||
other.cancelled == cancelled) &&
(identical(other.platform, platform) ||
other.platform == platform));
}
@JsonKey(ignore: true)
@override
int get hashCode =>
Object.hash(runtimeType, delay, real, cancelled, platform);
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$_StationStatusCopyWith<_$_StationStatus> get copyWith =>
__$$_StationStatusCopyWithImpl<_$_StationStatus>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$_StationStatusToJson(
this,
);
}
}
abstract class _StationStatus implements StationStatus {
const factory _StationStatus(
{required final int delay,
required final bool real,
required final bool cancelled,
required final String? platform}) = _$_StationStatus;
factory _StationStatus.fromJson(Map<String, dynamic> json) =
_$_StationStatus.fromJson;
@override
int get delay;
@override
bool get real;
@override
bool get cancelled;
@override
String? get platform;
@override
@JsonKey(ignore: true)
_$$_StationStatusCopyWith<_$_StationStatus> get copyWith =>
throw _privateConstructorUsedError;
}

View file

@ -1,23 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'station_status.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$_StationStatus _$$_StationStatusFromJson(Map<String, dynamic> json) =>
_$_StationStatus(
delay: json['delay'] as int,
real: json['real'] as bool,
cancelled: json['cancelled'] as bool,
platform: json['platform'] as String?,
);
Map<String, dynamic> _$$_StationStatusToJson(_$_StationStatus instance) =>
<String, dynamic>{
'delay': instance.delay,
'real': instance.real,
'cancelled': instance.cancelled,
'platform': instance.platform,
};

View file

@ -1,19 +0,0 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'station_train.g.dart';
part 'station_train.freezed.dart';
@freezed
class StationTrain with _$StationTrain {
const factory StationTrain({
required String rank,
required String number,
required String operator,
required String terminus,
List<String>? route,
required DateTime departureDate,
}) = _StationTrain;
factory StationTrain.fromJson(Map<String, dynamic> json) => _$StationTrainFromJson(json);
}

View file

@ -1,267 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'station_train.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
StationTrain _$StationTrainFromJson(Map<String, dynamic> json) {
return _StationTrain.fromJson(json);
}
/// @nodoc
mixin _$StationTrain {
String get rank => throw _privateConstructorUsedError;
String get number => throw _privateConstructorUsedError;
String get operator => throw _privateConstructorUsedError;
String get terminus => throw _privateConstructorUsedError;
List<String>? get route => throw _privateConstructorUsedError;
DateTime get departureDate => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$StationTrainCopyWith<StationTrain> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $StationTrainCopyWith<$Res> {
factory $StationTrainCopyWith(
StationTrain value, $Res Function(StationTrain) then) =
_$StationTrainCopyWithImpl<$Res, StationTrain>;
@useResult
$Res call(
{String rank,
String number,
String operator,
String terminus,
List<String>? route,
DateTime departureDate});
}
/// @nodoc
class _$StationTrainCopyWithImpl<$Res, $Val extends StationTrain>
implements $StationTrainCopyWith<$Res> {
_$StationTrainCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? rank = null,
Object? number = null,
Object? operator = null,
Object? terminus = null,
Object? route = freezed,
Object? departureDate = null,
}) {
return _then(_value.copyWith(
rank: null == rank
? _value.rank
: rank // ignore: cast_nullable_to_non_nullable
as String,
number: null == number
? _value.number
: number // ignore: cast_nullable_to_non_nullable
as String,
operator: null == operator
? _value.operator
: operator // ignore: cast_nullable_to_non_nullable
as String,
terminus: null == terminus
? _value.terminus
: terminus // ignore: cast_nullable_to_non_nullable
as String,
route: freezed == route
? _value.route
: route // ignore: cast_nullable_to_non_nullable
as List<String>?,
departureDate: null == departureDate
? _value.departureDate
: departureDate // ignore: cast_nullable_to_non_nullable
as DateTime,
) as $Val);
}
}
/// @nodoc
abstract class _$$_StationTrainCopyWith<$Res>
implements $StationTrainCopyWith<$Res> {
factory _$$_StationTrainCopyWith(
_$_StationTrain value, $Res Function(_$_StationTrain) then) =
__$$_StationTrainCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{String rank,
String number,
String operator,
String terminus,
List<String>? route,
DateTime departureDate});
}
/// @nodoc
class __$$_StationTrainCopyWithImpl<$Res>
extends _$StationTrainCopyWithImpl<$Res, _$_StationTrain>
implements _$$_StationTrainCopyWith<$Res> {
__$$_StationTrainCopyWithImpl(
_$_StationTrain _value, $Res Function(_$_StationTrain) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? rank = null,
Object? number = null,
Object? operator = null,
Object? terminus = null,
Object? route = freezed,
Object? departureDate = null,
}) {
return _then(_$_StationTrain(
rank: null == rank
? _value.rank
: rank // ignore: cast_nullable_to_non_nullable
as String,
number: null == number
? _value.number
: number // ignore: cast_nullable_to_non_nullable
as String,
operator: null == operator
? _value.operator
: operator // ignore: cast_nullable_to_non_nullable
as String,
terminus: null == terminus
? _value.terminus
: terminus // ignore: cast_nullable_to_non_nullable
as String,
route: freezed == route
? _value._route
: route // ignore: cast_nullable_to_non_nullable
as List<String>?,
departureDate: null == departureDate
? _value.departureDate
: departureDate // ignore: cast_nullable_to_non_nullable
as DateTime,
));
}
}
/// @nodoc
@JsonSerializable()
class _$_StationTrain implements _StationTrain {
const _$_StationTrain(
{required this.rank,
required this.number,
required this.operator,
required this.terminus,
final List<String>? route,
required this.departureDate})
: _route = route;
factory _$_StationTrain.fromJson(Map<String, dynamic> json) =>
_$$_StationTrainFromJson(json);
@override
final String rank;
@override
final String number;
@override
final String operator;
@override
final String terminus;
final List<String>? _route;
@override
List<String>? get route {
final value = _route;
if (value == null) return null;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
final DateTime departureDate;
@override
String toString() {
return 'StationTrain(rank: $rank, number: $number, operator: $operator, terminus: $terminus, route: $route, departureDate: $departureDate)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_StationTrain &&
(identical(other.rank, rank) || other.rank == rank) &&
(identical(other.number, number) || other.number == number) &&
(identical(other.operator, operator) ||
other.operator == operator) &&
(identical(other.terminus, terminus) ||
other.terminus == terminus) &&
const DeepCollectionEquality().equals(other._route, _route) &&
(identical(other.departureDate, departureDate) ||
other.departureDate == departureDate));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType, rank, number, operator, terminus,
const DeepCollectionEquality().hash(_route), departureDate);
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$_StationTrainCopyWith<_$_StationTrain> get copyWith =>
__$$_StationTrainCopyWithImpl<_$_StationTrain>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$_StationTrainToJson(
this,
);
}
}
abstract class _StationTrain implements StationTrain {
const factory _StationTrain(
{required final String rank,
required final String number,
required final String operator,
required final String terminus,
final List<String>? route,
required final DateTime departureDate}) = _$_StationTrain;
factory _StationTrain.fromJson(Map<String, dynamic> json) =
_$_StationTrain.fromJson;
@override
String get rank;
@override
String get number;
@override
String get operator;
@override
String get terminus;
@override
List<String>? get route;
@override
DateTime get departureDate;
@override
@JsonKey(ignore: true)
_$$_StationTrainCopyWith<_$_StationTrain> get copyWith =>
throw _privateConstructorUsedError;
}

View file

@ -1,28 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'station_train.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
_$_StationTrain _$$_StationTrainFromJson(Map<String, dynamic> json) =>
_$_StationTrain(
rank: json['rank'] as String,
number: json['number'] as String,
operator: json['operator'] as String,
terminus: json['terminus'] as String,
route:
(json['route'] as List<dynamic>?)?.map((e) => e as String).toList(),
departureDate: DateTime.parse(json['departureDate'] as String),
);
Map<String, dynamic> _$$_StationTrainToJson(_$_StationTrain instance) =>
<String, dynamic>{
'rank': instance.rank,
'number': instance.number,
'operator': instance.operator,
'terminus': instance.terminus,
'route': instance.route,
'departureDate': instance.departureDate.toIso8601String(),
};

View file

@ -1,14 +1,14 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:json_annotation/json_annotation.dart';
part 'stations_result.g.dart';
part 'stations_result.freezed.dart';
@freezed
class StationsResult with _$StationsResult {
const factory StationsResult({
required String name,
List<String>? stoppedAtBy,
}) = _StationsResult;
@JsonSerializable()
class StationsResult {
final String name;
final List<String>? stoppedAtBy;
const StationsResult({required this.name, this.stoppedAtBy});
factory StationsResult.fromJson(Map<String, dynamic> json) => _$StationsResultFromJson(json);
Map<String, dynamic> toJson() => _$StationsResultToJson(this);
}

View file

@ -1,178 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'stations_result.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
StationsResult _$StationsResultFromJson(Map<String, dynamic> json) {
return _StationsResult.fromJson(json);
}
/// @nodoc
mixin _$StationsResult {
String get name => throw _privateConstructorUsedError;
List<String>? get stoppedAtBy => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$StationsResultCopyWith<StationsResult> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $StationsResultCopyWith<$Res> {
factory $StationsResultCopyWith(
StationsResult value, $Res Function(StationsResult) then) =
_$StationsResultCopyWithImpl<$Res, StationsResult>;
@useResult
$Res call({String name, List<String>? stoppedAtBy});
}
/// @nodoc
class _$StationsResultCopyWithImpl<$Res, $Val extends StationsResult>
implements $StationsResultCopyWith<$Res> {
_$StationsResultCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? name = null,
Object? stoppedAtBy = freezed,
}) {
return _then(_value.copyWith(
name: null == name
? _value.name
: name // ignore: cast_nullable_to_non_nullable
as String,
stoppedAtBy: freezed == stoppedAtBy
? _value.stoppedAtBy
: stoppedAtBy // ignore: cast_nullable_to_non_nullable
as List<String>?,
) as $Val);
}
}
/// @nodoc
abstract class _$$_StationsResultCopyWith<$Res>
implements $StationsResultCopyWith<$Res> {
factory _$$_StationsResultCopyWith(
_$_StationsResult value, $Res Function(_$_StationsResult) then) =
__$$_StationsResultCopyWithImpl<$Res>;
@override
@useResult
$Res call({String name, List<String>? stoppedAtBy});
}
/// @nodoc
class __$$_StationsResultCopyWithImpl<$Res>
extends _$StationsResultCopyWithImpl<$Res, _$_StationsResult>
implements _$$_StationsResultCopyWith<$Res> {
__$$_StationsResultCopyWithImpl(
_$_StationsResult _value, $Res Function(_$_StationsResult) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? name = null,
Object? stoppedAtBy = freezed,
}) {
return _then(_$_StationsResult(
name: null == name
? _value.name
: name // ignore: cast_nullable_to_non_nullable
as String,
stoppedAtBy: freezed == stoppedAtBy
? _value._stoppedAtBy
: stoppedAtBy // ignore: cast_nullable_to_non_nullable
as List<String>?,
));
}
}
/// @nodoc
@JsonSerializable()
class _$_StationsResult implements _StationsResult {
const _$_StationsResult({required this.name, final List<String>? stoppedAtBy})
: _stoppedAtBy = stoppedAtBy;
factory _$_StationsResult.fromJson(Map<String, dynamic> json) =>
_$$_StationsResultFromJson(json);
@override
final String name;
final List<String>? _stoppedAtBy;
@override
List<String>? get stoppedAtBy {
final value = _stoppedAtBy;
if (value == null) return null;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(value);
}
@override
String toString() {
return 'StationsResult(name: $name, stoppedAtBy: $stoppedAtBy)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_StationsResult &&
(identical(other.name, name) || other.name == name) &&
const DeepCollectionEquality()
.equals(other._stoppedAtBy, _stoppedAtBy));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(
runtimeType, name, const DeepCollectionEquality().hash(_stoppedAtBy));
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$_StationsResultCopyWith<_$_StationsResult> get copyWith =>
__$$_StationsResultCopyWithImpl<_$_StationsResult>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$_StationsResultToJson(
this,
);
}
}
abstract class _StationsResult implements StationsResult {
const factory _StationsResult(
{required final String name,
final List<String>? stoppedAtBy}) = _$_StationsResult;
factory _StationsResult.fromJson(Map<String, dynamic> json) =
_$_StationsResult.fromJson;
@override
String get name;
@override
List<String>? get stoppedAtBy;
@override
@JsonKey(ignore: true)
_$$_StationsResultCopyWith<_$_StationsResult> get copyWith =>
throw _privateConstructorUsedError;
}

View file

@ -6,15 +6,15 @@ part of 'stations_result.dart';
// JsonSerializableGenerator
// **************************************************************************
_$_StationsResult _$$_StationsResultFromJson(Map<String, dynamic> json) =>
_$_StationsResult(
StationsResult _$StationsResultFromJson(Map<String, dynamic> json) =>
StationsResult(
name: json['name'] as String,
stoppedAtBy: (json['stoppedAtBy'] as List<dynamic>?)
?.map((e) => e as String)
.toList(),
);
Map<String, dynamic> _$$_StationsResultToJson(_$_StationsResult instance) =>
Map<String, dynamic> _$StationsResultToJson(StationsResult instance) =>
<String, dynamic>{
'name': instance.name,
'stoppedAtBy': instance.stoppedAtBy,

View file

@ -99,9 +99,9 @@ class Station {
: StationArrDepTime.fromJson(json["departure"]),
km: json["km"],
name: json["name"],
platform: json["platform"],
platform: json["platform"] == null ? null : json["platform"],
stoppingTime:
json["stoppingTime"],
json["stoppingTime"] == null ? null : json["stoppingTime"],
);
Map<String, dynamic> toJson() => {
@ -109,8 +109,8 @@ class Station {
"departure": departure?.toJson(),
"km": km,
"name": name,
"platform": platform,
"stoppingTime": stoppingTime,
"platform": platform == null ? null : platform,
"stoppingTime": stoppingTime == null ? null : stoppingTime,
};
}
@ -221,7 +221,9 @@ class EnumValues<T> {
EnumValues(this.map);
Map<T, String> get reverse {
reverseMap ??= map.map((k, v) => MapEntry(v, k));
if (reverseMap == null) {
reverseMap = map.map((k, v) => new MapEntry(v, k));
}
return reverseMap!;
}
}

View file

@ -1,15 +1,19 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:json_annotation/json_annotation.dart';
part 'trains_result.g.dart';
part 'trains_result.freezed.dart';
@freezed
class TrainsResult with _$TrainsResult {
const factory TrainsResult({
required String rank,
required String number,
required String company,
}) = _TrainsResult;
@JsonSerializable()
class TrainsResult {
final String rank;
final String number;
final String company;
const TrainsResult({
required this.rank,
required this.number,
required this.company,
});
factory TrainsResult.fromJson(Map<String, dynamic> json) => _$TrainsResultFromJson(json);
Map<String, dynamic> toJson() => _$TrainsResultToJson(this);
}

View file

@ -1,187 +0,0 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
part of 'trains_result.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
TrainsResult _$TrainsResultFromJson(Map<String, dynamic> json) {
return _TrainsResult.fromJson(json);
}
/// @nodoc
mixin _$TrainsResult {
String get rank => throw _privateConstructorUsedError;
String get number => throw _privateConstructorUsedError;
String get company => throw _privateConstructorUsedError;
Map<String, dynamic> toJson() => throw _privateConstructorUsedError;
@JsonKey(ignore: true)
$TrainsResultCopyWith<TrainsResult> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $TrainsResultCopyWith<$Res> {
factory $TrainsResultCopyWith(
TrainsResult value, $Res Function(TrainsResult) then) =
_$TrainsResultCopyWithImpl<$Res, TrainsResult>;
@useResult
$Res call({String rank, String number, String company});
}
/// @nodoc
class _$TrainsResultCopyWithImpl<$Res, $Val extends TrainsResult>
implements $TrainsResultCopyWith<$Res> {
_$TrainsResultCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
@pragma('vm:prefer-inline')
@override
$Res call({
Object? rank = null,
Object? number = null,
Object? company = null,
}) {
return _then(_value.copyWith(
rank: null == rank
? _value.rank
: rank // ignore: cast_nullable_to_non_nullable
as String,
number: null == number
? _value.number
: number // ignore: cast_nullable_to_non_nullable
as String,
company: null == company
? _value.company
: company // ignore: cast_nullable_to_non_nullable
as String,
) as $Val);
}
}
/// @nodoc
abstract class _$$_TrainsResultCopyWith<$Res>
implements $TrainsResultCopyWith<$Res> {
factory _$$_TrainsResultCopyWith(
_$_TrainsResult value, $Res Function(_$_TrainsResult) then) =
__$$_TrainsResultCopyWithImpl<$Res>;
@override
@useResult
$Res call({String rank, String number, String company});
}
/// @nodoc
class __$$_TrainsResultCopyWithImpl<$Res>
extends _$TrainsResultCopyWithImpl<$Res, _$_TrainsResult>
implements _$$_TrainsResultCopyWith<$Res> {
__$$_TrainsResultCopyWithImpl(
_$_TrainsResult _value, $Res Function(_$_TrainsResult) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
$Res call({
Object? rank = null,
Object? number = null,
Object? company = null,
}) {
return _then(_$_TrainsResult(
rank: null == rank
? _value.rank
: rank // ignore: cast_nullable_to_non_nullable
as String,
number: null == number
? _value.number
: number // ignore: cast_nullable_to_non_nullable
as String,
company: null == company
? _value.company
: company // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
@JsonSerializable()
class _$_TrainsResult implements _TrainsResult {
const _$_TrainsResult(
{required this.rank, required this.number, required this.company});
factory _$_TrainsResult.fromJson(Map<String, dynamic> json) =>
_$$_TrainsResultFromJson(json);
@override
final String rank;
@override
final String number;
@override
final String company;
@override
String toString() {
return 'TrainsResult(rank: $rank, number: $number, company: $company)';
}
@override
bool operator ==(dynamic other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$_TrainsResult &&
(identical(other.rank, rank) || other.rank == rank) &&
(identical(other.number, number) || other.number == number) &&
(identical(other.company, company) || other.company == company));
}
@JsonKey(ignore: true)
@override
int get hashCode => Object.hash(runtimeType, rank, number, company);
@JsonKey(ignore: true)
@override
@pragma('vm:prefer-inline')
_$$_TrainsResultCopyWith<_$_TrainsResult> get copyWith =>
__$$_TrainsResultCopyWithImpl<_$_TrainsResult>(this, _$identity);
@override
Map<String, dynamic> toJson() {
return _$$_TrainsResultToJson(
this,
);
}
}
abstract class _TrainsResult implements TrainsResult {
const factory _TrainsResult(
{required final String rank,
required final String number,
required final String company}) = _$_TrainsResult;
factory _TrainsResult.fromJson(Map<String, dynamic> json) =
_$_TrainsResult.fromJson;
@override
String get rank;
@override
String get number;
@override
String get company;
@override
@JsonKey(ignore: true)
_$$_TrainsResultCopyWith<_$_TrainsResult> get copyWith =>
throw _privateConstructorUsedError;
}

View file

@ -6,14 +6,13 @@ part of 'trains_result.dart';
// JsonSerializableGenerator
// **************************************************************************
_$_TrainsResult _$$_TrainsResultFromJson(Map<String, dynamic> json) =>
_$_TrainsResult(
TrainsResult _$TrainsResultFromJson(Map<String, dynamic> json) => TrainsResult(
rank: json['rank'] as String,
number: json['number'] as String,
company: json['company'] as String,
);
Map<String, dynamic> _$$_TrainsResultToJson(_$_TrainsResult instance) =>
Map<String, dynamic> _$TrainsResultToJson(TrainsResult instance) =>
<String, dynamic>{
'rank': instance.rank,
'number': instance.number,

View file

@ -1,6 +1,7 @@
import 'package:flutter/widgets.dart';
import 'package:info_tren/api/releases.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/changelog_entry.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/about/about_page_cupertino.dart';
import 'package:info_tren/pages/about/about_page_material.dart';
import 'package:info_tren/utils/default_ui_design.dart';
@ -29,7 +30,7 @@ class AboutPage extends StatefulWidget {
}
abstract class AboutPageState extends State<AboutPage> {
static const String download = String.fromEnvironment('DOWNLOAD');
static const String DOWNLOAD = String.fromEnvironment('DOWNLOAD');
final String pageTitle = 'Despre aplicație';
final String versionTitleText = 'Versiunea aplicației';

View file

@ -31,14 +31,14 @@ class AboutPageStateCupertino extends AboutPageState {
Center(
child: Text(
packageInfo!.packageName,
style: const TextStyle(
style: TextStyle(
inherit: true,
fontSize: 14,
),
),
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 8.0),
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: CupertinoDivider(),
),
for (final log in mergedChangelogs) ...[
@ -50,7 +50,7 @@ class AboutPageStateCupertino extends AboutPageState {
Expanded(
child: Text(
log.version.toString(),
style: const TextStyle(
style: TextStyle(
inherit: true,
fontSize: 24,
),
@ -69,7 +69,7 @@ class AboutPageStateCupertino extends AboutPageState {
padding: const EdgeInsets.all(4),
child: Text(
currentVersionText,
style: const TextStyle(
style: TextStyle(
inherit: true,
),
),
@ -88,16 +88,16 @@ class AboutPageStateCupertino extends AboutPageState {
padding: const EdgeInsets.all(4),
child: Text(
latestVersionText,
style: const TextStyle(
style: TextStyle(
inherit: true,
color: CupertinoColors.activeGreen,
),
),
),
),
if (AboutPageState.download == 'apk' && log.apkLink != null)
if (AboutPageState.DOWNLOAD == 'apk' && log.apkLink != null)
CupertinoButton(
padding: const EdgeInsets.all(4),
padding: EdgeInsets.all(4),
minSize: 0,
onPressed: () {
launchUrl(
@ -105,7 +105,7 @@ class AboutPageStateCupertino extends AboutPageState {
mode: LaunchMode.externalApplication,
);
},
child: const Icon(CupertinoIcons.arrow_down_circle),
child: Icon(CupertinoIcons.arrow_down_circle),
),
],
),
@ -118,7 +118,7 @@ class AboutPageStateCupertino extends AboutPageState {
),
),
),
const CupertinoDivider(),
CupertinoDivider(),
],
],
),

View file

@ -1,3 +1,4 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:info_tren/pages/about/about_page.dart';
@ -26,14 +27,14 @@ class AboutPageStateMaterial extends AboutPageState {
Center(
child: Text(
packageInfo!.packageName,
style: Theme.of(context).textTheme.bodySmall,
style: Theme.of(context).textTheme.caption,
),
),
// ListTile(
// title: Text(versionTitleText),
// subtitle: localChangelog.isEmpty ? null : Text(localChangelog.first.title),
// ),
const Divider(),
Divider(),
for (final log in mergedChangelogs) ...[
Padding(
padding: const EdgeInsets.fromLTRB(8, 8, 8, 0),
@ -43,7 +44,7 @@ class AboutPageStateMaterial extends AboutPageState {
Expanded(
child: Text(
log.version.toString(),
style: Theme.of(context).textTheme.headlineMedium,
style: Theme.of(context).textTheme.headline4,
),
),
if (localChangelog.isNotEmpty && log.version == localChangelog.first.version)
@ -59,7 +60,7 @@ class AboutPageStateMaterial extends AboutPageState {
padding: const EdgeInsets.all(4),
child: Text(
currentVersionText,
style: const TextStyle(
style: TextStyle(
inherit: true,
),
),
@ -78,24 +79,24 @@ class AboutPageStateMaterial extends AboutPageState {
padding: const EdgeInsets.all(4),
child: Text(
latestVersionText,
style: const TextStyle(
style: TextStyle(
inherit: true,
color: Colors.green,
),
),
),
),
if (AboutPageState.download == 'apk' && log.apkLink != null)
if (AboutPageState.DOWNLOAD == 'apk' && log.apkLink != null)
GestureDetector(
onSecondaryTap: () {
Clipboard.setData(ClipboardData(text: log.apkLink!.toString()));
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Link copied to clipboard'),
));
},
onLongPress: () {
Clipboard.setData(ClipboardData(text: log.apkLink!.toString()));
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('Link copied to clipboard'),
));
},
@ -106,10 +107,10 @@ class AboutPageStateMaterial extends AboutPageState {
);
},
behavior: HitTestBehavior.translucent,
child: const Tooltip(
child: Tooltip(
message: 'Download APK',
child: Padding(
padding: EdgeInsets.all(4),
padding: const EdgeInsets.all(4),
child: Icon(Icons.download),
),
),

View file

@ -1,5 +1,5 @@
import 'package:flutter/widgets.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/about/about_page.dart';
import 'package:info_tren/pages/main/main_page_cupertino.dart';
import 'package:info_tren/pages/main/main_page_material.dart';
@ -18,9 +18,9 @@ class MainPage extends StatelessWidget {
switch (uiDesign) {
case UiDesign.MATERIAL:
return const MainPageMaterial();
return MainPageMaterial();
case UiDesign.CUPERTINO:
return const MainPageCupertino();
return MainPageCupertino();
default:
throw UnmatchedUiDesignException(uiDesign);
}
@ -31,8 +31,6 @@ abstract class MainPageShared extends StatelessWidget {
final String pageTitle = 'Info Tren';
final String moreOptionsText = 'Mai multe opțiuni';
const MainPageShared({super.key});
List<MainPageAction> get popupMenu => [
MainPageAction(
name: 'Despre aplicație',

View file

@ -2,14 +2,13 @@ import 'package:flutter/cupertino.dart';
import 'package:info_tren/pages/main/main_page.dart';
class MainPageCupertino extends MainPageShared {
const MainPageCupertino({super.key});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text(pageTitle),
trailing: CupertinoButton(
child: Icon(CupertinoIcons.ellipsis_circle),
padding: EdgeInsets.zero,
onPressed: () {
showCupertinoModalPopup(
@ -27,13 +26,12 @@ class MainPageCupertino extends MainPageShared {
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('Anulare'),
child: Text('Anulare'),
),
);
},
);
},
child: const Icon(CupertinoIcons.ellipsis_circle),
),
),
child: SafeArea(
@ -41,16 +39,15 @@ class MainPageCupertino extends MainPageShared {
child: Column(
mainAxisSize: MainAxisSize.min,
children: options.map((option) => CupertinoButton.filled(
onPressed: option.action == null ? null : () => option.action!(context),
child: Text.rich(
TextSpan(
children: [
TextSpan(text: option.name),
if (option.description != null) ...[
const TextSpan(text: '\n'),
TextSpan(text: '\n'),
TextSpan(
text: option.description,
style: const TextStyle(
style: TextStyle(
inherit: true,
fontSize: 14,
),
@ -60,6 +57,7 @@ class MainPageCupertino extends MainPageShared {
),
textAlign: TextAlign.center,
),
onPressed: option.action == null ? null : () => option.action!(context),
)).map((w) => Padding(
padding: const EdgeInsets.fromLTRB(4, 2, 4, 2),
child: SizedBox(

View file

@ -2,8 +2,6 @@ import 'package:flutter/material.dart';
import 'package:info_tren/pages/main/main_page.dart';
class MainPageMaterial extends MainPageShared {
const MainPageMaterial({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
@ -12,11 +10,11 @@ class MainPageMaterial extends MainPageShared {
centerTitle: true,
actions: [
PopupMenuButton<int>(
icon: const Icon(Icons.more_vert),
icon: Icon(Icons.more_vert),
tooltip: moreOptionsText,
itemBuilder: (_) => popupMenu.asMap().entries.map((e) => PopupMenuItem(
value: e.key,
child: Text(e.value.name),
value: e.key,
)).toList(),
onSelected: (index) {
popupMenu[index].action?.call(context);
@ -38,7 +36,7 @@ class MainPageMaterial extends MainPageShared {
padding: const EdgeInsets.all(8.0),
child: Text(
option.name,
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
style: Theme.of(context).textTheme.headline4?.copyWith(
color: Theme.of(context).colorScheme.onSecondaryContainer,
),
textAlign: TextAlign.center,

View file

@ -1,10 +1,10 @@
import 'package:flutter/widgets.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/station_arrdep_page/select_station/select_station_cupertino.dart';
import 'package:info_tren/pages/station_arrdep_page/select_station/select_station_material.dart';
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
import 'package:info_tren/utils/default_ui_design.dart';
import 'package:info_tren/api/stations.dart' as api_stations;
import 'package:info_tren/api/stations.dart' as apiStations;
class SelectStationPage extends StatefulWidget {
final UiDesign? uiDesign;
@ -63,7 +63,7 @@ abstract class SelectStationPageState extends State<SelectStationPage> {
@override
void initState() {
api_stations.stations.then((value) {
apiStations.stations.then((value) {
setState(() {
stations = value.map((e) => e.name).toList(growable: false,);
});

View file

@ -6,7 +6,7 @@ class SelectStationPageStateCupertino extends SelectStationPageState {
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: const CupertinoNavigationBar(
navigationBar: CupertinoNavigationBar(
middle: Text(SelectStationPageState.pageTitle),
),
child: SafeArea(
@ -38,7 +38,7 @@ class SelectStationPageStateCupertino extends SelectStationPageState {
),
onTap: () => onSuggestionSelected(filteredStations[index]),
),
const CupertinoDivider(),
CupertinoDivider(),
],
);
},

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:info_tren/pages/station_arrdep_page/select_station/select_station.dart';
class SelectStationPageStateMaterial extends SelectStationPageState {
@ -6,7 +7,7 @@ class SelectStationPageStateMaterial extends SelectStationPageState {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(SelectStationPageState.pageTitle),
title: Text(SelectStationPageState.pageTitle),
centerTitle: true,
),
body: SafeArea(
@ -19,7 +20,7 @@ class SelectStationPageStateMaterial extends SelectStationPageState {
child: TextField(
controller: textEditingController,
autofocus: true,
decoration: const InputDecoration(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: SelectStationPageState.textFieldLabel,
),
@ -38,7 +39,7 @@ class SelectStationPageStateMaterial extends SelectStationPageState {
title: Text(filteredStations[index]),
onTap: () => onSuggestionSelected(filteredStations[index]),
),
const Divider(
Divider(
height: 1,
),
],

View file

@ -1,7 +1,8 @@
import 'package:flutter/widgets.dart';
import 'package:info_tren/api/station_data.dart';
import 'package:info_tren/components/refresh_future_builder.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/station_data.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station_cupertino.dart';
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station_material.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';

View file

@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart';
import 'package:info_tren/components/loading/loading.dart';
import 'package:info_tren/components/refresh_future_builder.dart';
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/station_data.dart';
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
class ViewStationPageStateCupertino extends ViewStationPageState {
@ -14,7 +14,7 @@ class ViewStationPageStateCupertino extends ViewStationPageState {
),
child: snapshot.hasData ? CupertinoTabScaffold(
tabBar: CupertinoTabBar(
items: const [
items: [
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.arrow_down),
label: ViewStationPageState.arrivals,
@ -56,16 +56,17 @@ class ViewStationPageStateCupertino extends ViewStationPageState {
return GestureDetector(
onTap: () => onTrainTapped(item.train),
child: CupertinoFormRow(
child: Text('${item.time.toLocal().hour.toString().padLeft(2, '0')}:${item.time.toLocal().minute.toString().padLeft(2, '0')}'),
prefix: Text.rich(
TextSpan(
children: [
TextSpan(
text: item.train.rank,
style: TextStyle(
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
color: item.train.rank.startsWith('IR') ? Color.fromARGB(255, 255, 0, 0) : null,
),
),
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(text: item.train.number,),
],
),
@ -73,13 +74,12 @@ class ViewStationPageStateCupertino extends ViewStationPageState {
helper: Text.rich(
TextSpan(
children: [
const TextSpan(text: ViewStationPageState.arrivesFrom),
const TextSpan(text: ' '),
TextSpan(text: ViewStationPageState.arrivesFrom),
TextSpan(text: ' '),
TextSpan(text: item.train.terminus),
],
),
),
child: Text('${item.time.toLocal().hour.toString().padLeft(2, '0')}:${item.time.toLocal().minute.toString().padLeft(2, '0')}'),
),
);
}
@ -89,16 +89,17 @@ class ViewStationPageStateCupertino extends ViewStationPageState {
return GestureDetector(
onTap: () => onTrainTapped(item.train),
child: CupertinoFormRow(
child: Text('${item.time.toLocal().hour.toString().padLeft(2, '0')}:${item.time.toLocal().minute.toString().padLeft(2, '0')}'),
prefix: Text.rich(
TextSpan(
children: [
TextSpan(
text: item.train.rank,
style: TextStyle(
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
color: item.train.rank.startsWith('IR') ? Color.fromARGB(255, 255, 0, 0) : null,
),
),
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(text: item.train.number,),
],
),
@ -106,13 +107,12 @@ class ViewStationPageStateCupertino extends ViewStationPageState {
helper: Text.rich(
TextSpan(
children: [
const TextSpan(text: ViewStationPageState.departsTo),
const TextSpan(text: ' '),
TextSpan(text: ViewStationPageState.departsTo),
TextSpan(text: ' '),
TextSpan(text: item.train.terminus),
],
),
),
child: Text('${item.time.toLocal().hour.toString().padLeft(2, '0')}:${item.time.toLocal().minute.toString().padLeft(2, '0')}'),
),
);
}

View file

@ -4,7 +4,7 @@ import 'package:flutter/material.dart';
import 'package:info_tren/components/badge.dart';
import 'package:info_tren/components/loading/loading.dart';
import 'package:info_tren/components/refresh_future_builder.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/station_data.dart';
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
class ViewStationPageStateMaterial extends ViewStationPageState {
@ -21,7 +21,7 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
? Container()
: CustomScrollView(
slivers: [
SliverToBoxAdapter(child: SafeArea(left: false, bottom: false, right: false,child: Container(),),),
SliverToBoxAdapter(child: SafeArea(child: Container(), left: false, bottom: false, right: false,),),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
@ -33,7 +33,7 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
],
),
bottomNavigationBar: snapshot.hasData ? BottomNavigationBar(
items: const [
items: [
BottomNavigationBarItem(
icon: Icon(Icons.arrow_downward),
label: ViewStationPageState.arrivals,
@ -67,7 +67,7 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
'${item.time.toLocal().hour.toString().padLeft(2, '0')}:${item.time.toLocal().minute.toString().padLeft(2, '0')}',
style: TextStyle(
inherit: true,
fontFeatures: const [
fontFeatures: [
FontFeature.tabularFigures(),
],
decoration: item.status.cancelled || item.status.delay != 0 ? TextDecoration.lineThrough : null,
@ -83,7 +83,7 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
'${newTime.toLocal().hour.toString().padLeft(2, '0')}:${newTime.toLocal().minute.toString().padLeft(2, '0')}',
style: TextStyle(
inherit: true,
fontFeatures: const [
fontFeatures: [
FontFeature.tabularFigures(),
],
color: delay ? Colors.red : Colors.green,
@ -104,10 +104,10 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
TextSpan(
text: item.train.rank,
style: TextStyle(
color: item.train.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
color: item.train.rank.startsWith('IR') ? Color.fromARGB(255, 255, 0, 0) : null,
),
),
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(text: item.train.number,),
],
),
@ -122,21 +122,21 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
? (arrival ? ViewStationPageState.arrivedFrom : ViewStationPageState.departedTo)
: (arrival ? ViewStationPageState.arrivesFrom : ViewStationPageState.departsTo)
),
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(text: item.train.terminus),
if (item.status.delay != 0) ...[
const TextSpan(text: '\n'),
TextSpan(text: '\n'),
if (item.status.delay.abs() >= 60) ...[
TextSpan(text: (item.status.delay.abs() ~/ 60).toString()),
TextSpan(text: item.status.delay.abs() >= 120 ? ' ore' : ' oră'),
if (item.status.delay.abs() % 60 != 0)
const TextSpan(text: ' și '),
TextSpan(text: ' și '),
],
TextSpan(text: (item.status.delay.abs() % 60).toString()),
TextSpan(text: item.status.delay.abs() > 1 ? ' minute' : ' minut'),
const TextSpan(text: ' '),
TextSpan(text: ' '),
if (item.status.delay > 0)
const TextSpan(
TextSpan(
text: 'întârziere',
style: TextStyle(
inherit: true,
@ -144,7 +144,7 @@ class ViewStationPageStateMaterial extends ViewStationPageState {
),
)
else
const TextSpan(
TextSpan(
text: 'mai devreme',
style: TextStyle(
inherit: true,

View file

@ -1,20 +1,23 @@
import 'dart:io' show Platform;
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:info_tren/components/select_train_suggestions/select_train_suggestions.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/trains_result.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/train_info_page/select_train/select_train_cupertino.dart';
import 'package:info_tren/pages/train_info_page/select_train/select_train_material.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
import 'package:info_tren/utils/default_ui_design.dart';
import 'package:info_tren/api/trains.dart' as api_trains;
import 'package:info_tren/api/trains.dart' as apiTrains;
import 'package:tuple/tuple.dart';
typedef TrainSelectedCallback = Function(int trainNumber);
typedef TrainSelectedCallback(int trainNumber);
class SelectTrainPage extends StatefulWidget {
final UiDesign? uiDesign;
const SelectTrainPage({Key? key, this.uiDesign}) : super(key: key);
SelectTrainPage({Key? key, this.uiDesign}) : super(key: key);
static String routeName = "/trainInfo/selectTrain";
@ -74,7 +77,7 @@ abstract class SelectTrainPageState extends State<SelectTrainPage> {
@override
void initState() {
api_trains.trains.then((value) {
apiTrains.trains.then((value) {
setState(() {
trains = value;
trains.sort((t1, t2) {

View file

@ -21,7 +21,7 @@ class SelectTrainPageStateMaterial extends SelectTrainPageState {
controller: trainNoController,
autofocus: true,
decoration: InputDecoration(
border: const OutlineInputBorder(),
border: OutlineInputBorder(),
labelText: textFieldLabel,
),
inputFormatters: [

View file

@ -1,10 +1,10 @@
import 'dart:ui';
const backgroundGreen = Color.fromRGBO(5, 66, 10, 1);
const foregroundGreen = Color.fromRGBO(20, 180, 50, 1);
const BACKGROUND_GREEN = Color.fromRGBO(5, 66, 10, 1);
const FOREGROUND_GREEN = Color.fromRGBO(20, 180, 50, 1);
const backgroundRed = Color.fromRGBO(66, 10, 5, 1);
const BACKGROUND_RED = Color.fromRGBO(66, 10, 5, 1);
const foregroundWhite = Color.fromRGBO(240, 250, 240, 1);
const FOREGROUND_WHITE = Color.fromRGBO(240, 250, 240, 1);
const foregroundDarkGrey = Color.fromRGBO(55, 55, 55, 1);
const FOREGROUND_DARK_GREY = Color.fromRGBO(55, 55, 55, 1);

View file

@ -4,7 +4,8 @@ import 'package:flutter/cupertino.dart';
import 'package:info_tren/api/train_data.dart';
import 'package:info_tren/components/loading/loading.dart';
import 'package:info_tren/components/refresh_future_builder.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/train_data.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info_cupertino.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info_material.dart';
import 'package:info_tren/utils/default_ui_design.dart';
@ -17,7 +18,7 @@ class TrainInfo extends StatelessWidget {
final String trainNumber;
final DateTime? date;
const TrainInfo({Key? key, required this.trainNumber, this.date, this.uiDesign}): super(key: key);
TrainInfo({Key? key, required this.trainNumber, this.date, this.uiDesign}): super(key: key);
@override
Widget build(BuildContext context) {
@ -77,12 +78,7 @@ abstract class TrainInfoLoading extends StatelessWidget {
final String title;
final Widget loadingWidget;
TrainInfoLoading({
required this.title,
String? loadingText,
UiDesign? uiDesign,
super.key,
}) : loadingWidget = Loading(uiDesign: uiDesign, text: loadingText,);
TrainInfoLoading({required this.title, String? loadingText, UiDesign? uiDesign}) : loadingWidget = Loading(uiDesign: uiDesign, text: loadingText,);
}
abstract class TrainInfoError extends StatelessWidget {
@ -90,7 +86,7 @@ abstract class TrainInfoError extends StatelessWidget {
final Object error;
final Future Function()? refresh;
const TrainInfoError({required this.title, required this.error, this.refresh, super.key,});
TrainInfoError({required this.title, required this.error, this.refresh});
}
abstract class DisplayTrainYesterdayWarningCommon extends StatelessWidget {
@ -99,5 +95,5 @@ abstract class DisplayTrainYesterdayWarningCommon extends StatelessWidget {
final void Function() onViewYesterdayTrain;
const DisplayTrainYesterdayWarningCommon(this.onViewYesterdayTrain, {super.key,});
DisplayTrainYesterdayWarningCommon(this.onViewYesterdayTrain);
}

View file

@ -4,15 +4,19 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/gestures.dart';
import 'package:info_tren/components/cupertino_divider.dart';
import 'package:info_tren/components/sliver_persistent_header_padding.dart';
import 'package:info_tren/models.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';
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info_cupertino_DisplayTrainStation.dart';
import 'package:info_tren/utils/state_to_string.dart';
class TrainInfoLoadingCupertino extends TrainInfoLoading {
TrainInfoLoadingCupertino({required super.title, super.loadingText, super.key,})
: super(uiDesign: UiDesign.CUPERTINO);
TrainInfoLoadingCupertino({required String title, String? loadingText})
: super(
title: title,
loadingText: loadingText,
uiDesign: UiDesign.CUPERTINO);
@override
Widget build(BuildContext context) {
@ -28,11 +32,10 @@ class TrainInfoLoadingCupertino extends TrainInfoLoading {
}
class TrainInfoErrorCupertino extends TrainInfoError {
const TrainInfoErrorCupertino({
TrainInfoErrorCupertino({
required Object error,
required String title,
Future Function()? refresh,
super.key,
}) : super(
error: error,
title: title,
@ -54,7 +57,7 @@ class TrainInfoErrorCupertino extends TrainInfoError {
Padding(
padding: const EdgeInsets.all(8),
child: CupertinoButton(
child: const Text('Retry'),
child: Text('Retry'),
onPressed: () => refresh!(),
),
),
@ -71,12 +74,11 @@ class TrainInfoCupertino extends StatelessWidget {
final bool? isRefreshing;
final void Function()? onViewYesterdayTrain;
const TrainInfoCupertino({
TrainInfoCupertino({
required this.trainData,
this.refresh,
this.isRefreshing,
this.onViewYesterdayTrain,
super.key,
});
@override
@ -84,10 +86,10 @@ class TrainInfoCupertino extends StatelessWidget {
return CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text("Informații despre ${trainData.rank} ${trainData.number}"),
trailing: refresh == null ? null : isRefreshing == true ? const CupertinoActivityIndicator() : CupertinoButton(
trailing: refresh == null ? null : isRefreshing == true ? CupertinoActivityIndicator() : CupertinoButton(
padding: const EdgeInsets.all(0),
alignment: Alignment.center,
child: const Icon(CupertinoIcons.refresh),
child: Icon(CupertinoIcons.refresh),
onPressed: () => refresh!(),
),
),
@ -120,11 +122,11 @@ class TrainInfoCupertino extends StatelessWidget {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(
Container(
height: pulledExtent,
child: Column(
children: [
SizedBox(
Container(
height: min(
refreshIndicatorExtent, pulledExtent),
child: Center(
@ -135,12 +137,12 @@ class TrainInfoCupertino extends StatelessWidget {
return Container();
} else if (mode ==
RefreshIndicatorMode.done) {
return const Text('Refreshed!');
return Text('Refreshed!');
} else if (mode ==
RefreshIndicatorMode.drag) {
return Row(
mainAxisSize: MainAxisSize.min,
children: const [
children: [
CupertinoActivityIndicator(
animating: false,
),
@ -151,7 +153,7 @@ class TrainInfoCupertino extends StatelessWidget {
RefreshIndicatorMode.armed) {
return Row(
mainAxisSize: MainAxisSize.min,
children: const [
children: [
CupertinoActivityIndicator(
animating: false,
),
@ -161,7 +163,7 @@ class TrainInfoCupertino extends StatelessWidget {
} else {
return Row(
mainAxisSize: MainAxisSize.min,
children: const [
children: [
CupertinoActivityIndicator(),
Text('Refreshing'),
],
@ -194,15 +196,15 @@ class TrainInfoCupertino extends StatelessWidget {
DisplayTrainDeparture(
trainData: trainData,
),
const SliverToBoxAdapter(
SliverToBoxAdapter(
child: CupertinoDivider(
color: foregroundWhite,
color: FOREGROUND_WHITE,
),
),
DisplayTrainLastInfo(
trainData: trainData,
),
const SliverToBoxAdapter(
SliverToBoxAdapter(
child: CupertinoDivider(),
),
SliverToBoxAdapter(
@ -220,7 +222,7 @@ class TrainInfoCupertino extends StatelessWidget {
// Expanded(
// child: DisplayTrainDestination(trainData: trainData,),
// ),
const SizedBox(
SizedBox(
height: double.infinity,
child: CupertinoVerticalDivider(),
),
@ -255,18 +257,18 @@ class TrainInfoCupertino extends StatelessWidget {
// ),
// ),
// ),
const SliverToBoxAdapter(
SliverToBoxAdapter(
child: CupertinoDivider(
color: foregroundWhite,
color: FOREGROUND_WHITE,
),
),
if (onViewYesterdayTrain != null && trainData.stations.first.departure!.scheduleTime.compareTo(DateTime.now()) > 0) ...[
SliverToBoxAdapter(
child: DisplayTrainYesterdayWarningCupertino(onViewYesterdayTrain!),
),
const SliverToBoxAdapter(
SliverToBoxAdapter(
child: CupertinoDivider(
color: foregroundWhite,
color: FOREGROUND_WHITE,
),
),
],
@ -393,7 +395,7 @@ class TrainInfoCupertino extends StatelessWidget {
class DisplayTrainID extends StatelessWidget {
final TrainData trainData;
const DisplayTrainID({required this.trainData, super.key,});
DisplayTrainID({required this.trainData});
@override
Widget build(BuildContext context) {
@ -407,10 +409,10 @@ class DisplayTrainID extends StatelessWidget {
TextSpan(
text: trainData.rank,
style: TextStyle(
color: trainData.rank.startsWith('IR') ? const Color.fromARGB(255, 255, 0, 0) : null,
color: trainData.rank.startsWith('IR') ? Color.fromARGB(255, 255, 0, 0) : null,
),
),
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(text: trainData.number,),
],
),
@ -425,7 +427,7 @@ class DisplayTrainID extends StatelessWidget {
class DisplayTrainRoute extends StatelessWidget {
final TrainData trainData;
const DisplayTrainRoute({required this.trainData, super.key,});
DisplayTrainRoute({required this.trainData});
@override
Widget build(BuildContext context) {
@ -446,7 +448,7 @@ class DisplayTrainRoute extends StatelessWidget {
),
),
),
const Center(child: Text("-")),
Center(child: Text("-")),
Expanded(
child: Center(
child: Padding(
@ -471,7 +473,7 @@ class DisplayTrainRoute extends StatelessWidget {
class DisplayTrainOperator extends StatelessWidget {
final TrainData trainData;
const DisplayTrainOperator({required this.trainData, super.key,});
DisplayTrainOperator({required this.trainData});
@override
Widget build(BuildContext context) {
@ -492,7 +494,7 @@ class DisplayTrainOperator extends StatelessWidget {
class DisplayTrainDeparture extends StatelessWidget {
final TrainData trainData;
const DisplayTrainDeparture({required this.trainData, super.key,});
DisplayTrainDeparture({required this.trainData});
@override
Widget build(BuildContext context) {
@ -516,7 +518,7 @@ class DisplayTrainDeparture extends StatelessWidget {
class DisplayTrainLastInfo extends StatelessWidget {
final TrainData trainData;
const DisplayTrainLastInfo({required this.trainData, super.key,});
DisplayTrainLastInfo({required this.trainData});
@override
Widget build(BuildContext context) {
@ -690,7 +692,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
class DisplayTrainDestination extends StatelessWidget {
final TrainData trainData;
const DisplayTrainDestination({required this.trainData, super.key,});
DisplayTrainDestination({required this.trainData});
@override
Widget build(BuildContext context) {
@ -708,7 +710,7 @@ class DisplayTrainDestination extends StatelessWidget {
textAlign: TextAlign.center,
),
),
const CupertinoDivider(
CupertinoDivider(
color: Color.fromRGBO(15, 15, 15, 1),
),
Padding(
@ -748,20 +750,20 @@ class DisplayTrainDestination extends StatelessWidget {
TextSpan(
text: 'la',
children: [
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(
text:
'${arrival.hour.toString().padLeft(2, "0")}:${arrival.minute.toString().padLeft(2, "0")}',
style: delay == 0
? null
: const TextStyle(
: TextStyle(
decoration: TextDecoration.lineThrough,
),
),
if (delay != 0) ...[
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(
text: arrivalWithDelayString,
text: '$arrivalWithDelayString',
style: TextStyle(
color: delay > 0
? CupertinoColors.systemRed
@ -790,7 +792,7 @@ class DisplayTrainDestination extends StatelessWidget {
class DisplayTrainRouteDistance extends StatelessWidget {
final TrainData trainData;
const DisplayTrainRouteDistance({required this.trainData, super.key,});
DisplayTrainRouteDistance({required this.trainData});
@override
Widget build(BuildContext context) {
@ -820,7 +822,7 @@ class DisplayTrainRouteDistance extends StatelessWidget {
class DisplayTrainRouteDuration extends StatelessWidget {
final TrainData trainData;
const DisplayTrainRouteDuration({required this.trainData, super.key,});
DisplayTrainRouteDuration({required this.trainData});
@override
Widget build(BuildContext context) {
@ -847,11 +849,10 @@ class DisplayTrainRouteDuration extends StatelessWidget {
if (duration.inDays > 0) {
firstWritten = true;
if (duration.inDays == 1) {
if (duration.inDays == 1)
durationString.write("1 zi");
} else {
else
durationString.write("${duration.inDays} zile");
}
duration -= Duration(days: duration.inDays);
}
@ -860,11 +861,10 @@ class DisplayTrainRouteDuration extends StatelessWidget {
durationString.write(", ");
}
firstWritten = true;
if (duration.inHours == 1) {
if (duration.inHours == 1)
durationString.write("1 oră");
} else {
else
durationString.write("${duration.inHours} ore");
}
duration -= Duration(hours: duration.inHours);
}
@ -873,11 +873,10 @@ class DisplayTrainRouteDuration extends StatelessWidget {
durationString.write(", ");
}
firstWritten = true;
if (duration.inMinutes == 1) {
if (duration.inMinutes == 1)
durationString.write("1 minut");
} else {
else
durationString.write("${duration.inMinutes} minute");
}
duration -= Duration(minutes: duration.inMinutes);
}
@ -896,7 +895,7 @@ class DisplayTrainRouteDuration extends StatelessWidget {
}
class DisplayTrainYesterdayWarningCupertino extends DisplayTrainYesterdayWarningCommon {
const DisplayTrainYesterdayWarningCupertino(super.onViewYesterdayTrain, {super.key,});
DisplayTrainYesterdayWarningCupertino(void Function() onViewYesterdayTrain) : super(onViewYesterdayTrain);
@override
Widget build(BuildContext context) {
@ -908,11 +907,11 @@ class DisplayTrainYesterdayWarningCupertino extends DisplayTrainYesterdayWarning
child: Text.rich(
TextSpan(
children: [
const TextSpan(text: DisplayTrainYesterdayWarningCommon.trainDidNotDepart,),
const TextSpan(text: '\n'),
TextSpan(text: DisplayTrainYesterdayWarningCommon.trainDidNotDepart,),
TextSpan(text: '\n'),
TextSpan(
text: DisplayTrainYesterdayWarningCommon.seeYesterdayTrain,
style: const TextStyle(
style: TextStyle(
color: CupertinoColors.link,
),
recognizer: TapGestureRecognizer()
@ -931,9 +930,8 @@ class DisplayTrainYesterdayWarningCupertino extends DisplayTrainYesterdayWarning
class DisplayTrainStations extends StatelessWidget {
final TrainData trainData;
const DisplayTrainStations({
DisplayTrainStations({
required this.trainData,
super.key,
});
@override
@ -942,14 +940,14 @@ class DisplayTrainStations extends StatelessWidget {
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index.isOdd) {
return const CupertinoDivider();
return CupertinoDivider();
} else {
final itemIndex = index ~/ 2;
return IndexedSemantics(
index: itemIndex,
child: DisplayTrainStation(
station: trainData.stations[itemIndex],
),
index: itemIndex,
);
}
},

View file

@ -1,11 +1,11 @@
import 'package:flutter/cupertino.dart';
import 'package:info_tren/models/train_data.dart';
import 'package:info_tren/components/badge.dart';
import 'package:info_tren/models.dart';
class DisplayTrainStation extends StatelessWidget {
final Station station;
const DisplayTrainStation({required this.station, super.key,});
DisplayTrainStation({required this.station});
@override
Widget build(BuildContext context) {
@ -45,7 +45,7 @@ class DisplayTrainStation extends StatelessWidget {
final isDelayed = delay > 0 && real == true;
final isOnTime = delay <= 0 && real == true;
const isNotScheduled = false;
final isNotScheduled = false;
return CupertinoBadge(
text: station.km.toString(),
@ -84,9 +84,8 @@ class DisplayTrainStation extends StatelessWidget {
class Title extends StatelessWidget {
final Station station;
const Title({
required this.station,
super.key,
Title({
required this.station
});
@override
@ -106,9 +105,8 @@ class Title extends StatelessWidget {
class Time extends StatelessWidget {
final Station station;
const Time({
Time({
required this.station,
super.key,
});
@override
@ -160,10 +158,9 @@ class ArrivalTime extends StatelessWidget {
final Station station;
final bool finalStation;
const ArrivalTime({
ArrivalTime({
required this.station,
this.finalStation = false,
super.key,
});
@override
@ -179,7 +176,7 @@ class ArrivalTime extends StatelessWidget {
),
),
Container(width: 2,),
const Text("sosire la "),
Text("sosire la "),
ArrivalTime(station: station,),
Expanded(child: Container(),),
],
@ -243,9 +240,8 @@ class ArrivalTime extends StatelessWidget {
class StopTime extends StatelessWidget {
final Station station;
const StopTime({
StopTime({
required this.station,
super.key,
});
@override
@ -254,7 +250,7 @@ class StopTime extends StatelessWidget {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const Text(
Text(
"staționează pentru",
textAlign: TextAlign.center,
),
@ -274,13 +270,13 @@ class StopTime extends StatelessWidget {
}
else if (stopsForInt < 20) {
return Text(
'$stopsForInt ${minutes ? 'minute' : 'seconde'}',
'$stopsForInt ' + (minutes ? 'minute' : 'seconde'),
textAlign: TextAlign.center,
);
}
else {
return Text(
'$stopsForInt de ${minutes ? 'minute' : 'secunde'}',
'$stopsForInt de ' + (minutes ? 'minute' : 'secunde'),
textAlign: TextAlign.center,
);
}
@ -295,10 +291,9 @@ class DepartureTime extends StatelessWidget {
final Station station;
final bool firstStation;
const DepartureTime({
DepartureTime({
required this.station,
this.firstStation = false,
super.key,
});
@override
@ -308,7 +303,7 @@ class DepartureTime extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(child: Container(),),
const Text("plecare la "),
Text("plecare la "),
DepartureTime(station: station,),
Container(width: 2,),
Text(
@ -378,9 +373,8 @@ class DepartureTime extends StatelessWidget {
class Delay extends StatelessWidget {
final Station station;
const Delay({
Delay({
required this.station,
super.key,
});
@override
@ -393,9 +387,8 @@ class Delay extends StatelessWidget {
delay = station.departure?.status?.delay;
}
if (delay == 0 || delay == null) {
return Container();
} else if (delay > 0) {
if (delay == 0 || delay == null) return Container();
else if (delay > 0) {
return Text(
"$delay ${delay == 1 ? 'minut' : 'minute'} întârziere",
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith(

View file

@ -1,15 +1,19 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:info_tren/components/slim_app_bar.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/train_data.dart' hide State;
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info_material_DisplayTrainStation.dart';
import 'package:info_tren/utils/state_to_string.dart';
class TrainInfoLoadingMaterial extends TrainInfoLoading {
TrainInfoLoadingMaterial({required super.title, super.loadingText, super.key,})
: super(uiDesign: UiDesign.MATERIAL);
TrainInfoLoadingMaterial({required String title, String? loadingText})
: super(
title: title,
loadingText: loadingText,
uiDesign: UiDesign.MATERIAL);
@override
Widget build(BuildContext context) {
@ -26,12 +30,15 @@ class TrainInfoLoadingMaterial extends TrainInfoLoading {
}
class TrainInfoErrorMaterial extends TrainInfoError {
const TrainInfoErrorMaterial({
required super.error,
required super.title,
super.refresh,
super.key,
});
TrainInfoErrorMaterial({
required Object error,
required String title,
Future Function()? refresh,
}) : super(
error: error,
title: title,
refresh: refresh,
);
@override
Widget build(BuildContext context) {
@ -48,7 +55,7 @@ class TrainInfoErrorMaterial extends TrainInfoError {
Padding(
padding: const EdgeInsets.all(8),
child: ElevatedButton(
child: const Text('Retry'),
child: Text('Retry'),
onPressed: () => refresh!(),
),
),
@ -67,11 +74,10 @@ class TrainInfoMaterial extends StatelessWidget {
final Future Function()? refresh;
final void Function()? onViewYesterdayTrain;
const TrainInfoMaterial({
TrainInfoMaterial({
required this.trainData,
this.refresh,
this.onViewYesterdayTrain,
super.key,
});
@override
@ -214,7 +220,7 @@ class TrainInfoMaterial extends StatelessWidget {
class DisplayTrainID extends StatelessWidget {
final TrainData trainData;
const DisplayTrainID({required this.trainData, super.key,});
DisplayTrainID({required this.trainData});
@override
Widget build(BuildContext context) {
@ -225,21 +231,21 @@ class DisplayTrainID extends StatelessWidget {
text: trainData.rank,
style: TextStyle(
color: trainData.rank.startsWith('IR')
? const Color.fromARGB(255, 255, 0, 0)
? Color.fromARGB(255, 255, 0, 0)
: null,
),
),
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(
text: trainData.number,
),
],
),
style: (isSmallScreen(context)
? Theme.of(context).textTheme.headlineMedium
: Theme.of(context).textTheme.displaySmall)
? Theme.of(context).textTheme.headline4
: Theme.of(context).textTheme.headline3)
?.copyWith(
color: Theme.of(context).textTheme.bodyMedium?.color,
color: Theme.of(context).textTheme.bodyText2?.color,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
@ -250,13 +256,13 @@ class DisplayTrainID extends StatelessWidget {
class DisplayTrainOperator extends StatelessWidget {
final TrainData trainData;
const DisplayTrainOperator({required this.trainData, super.key,});
DisplayTrainOperator({required this.trainData});
@override
Widget build(BuildContext context) {
return Text(
trainData.operator,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontStyle: FontStyle.italic,
fontSize: isSmallScreen(context) ? 12 : 14,
),
@ -268,7 +274,7 @@ class DisplayTrainOperator extends StatelessWidget {
class DisplayTrainRoute extends StatelessWidget {
final TrainData trainData;
const DisplayTrainRoute({required this.trainData, super.key,});
DisplayTrainRoute({required this.trainData});
@override
Widget build(BuildContext context) {
@ -280,21 +286,21 @@ class DisplayTrainRoute extends StatelessWidget {
padding: const EdgeInsets.all(4),
child: Text(
trainData.route.from,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: 16,
),
),
),
),
),
const Center(child: Text("-")),
Center(child: Text("-")),
Expanded(
child: Center(
child: Padding(
padding: const EdgeInsets.all(4),
child: Text(
trainData.route.to,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: 16,
),
textAlign: TextAlign.right,
@ -310,7 +316,7 @@ class DisplayTrainRoute extends StatelessWidget {
class DisplayTrainDeparture extends StatelessWidget {
final TrainData trainData;
const DisplayTrainDeparture({required this.trainData, super.key});
DisplayTrainDeparture({required this.trainData});
@override
Widget build(BuildContext context) {
@ -319,7 +325,7 @@ class DisplayTrainDeparture extends StatelessWidget {
child: Text(
// "Plecare în ${dataPlecare.day.toString().padLeft(2, '0')}.${dataPlecare.month.toString().padLeft(2, '0')}.${dataPlecare.year.toString().padLeft(4, '0')}",
"Plecare în ${trainData.date}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w200,
fontSize: isSmallScreen(context) ? 14 : 16,
@ -333,7 +339,7 @@ class DisplayTrainDeparture extends StatelessWidget {
class DisplayTrainLastInfo extends StatelessWidget {
final TrainData trainData;
const DisplayTrainLastInfo({required this.trainData, super.key,});
DisplayTrainLastInfo({required this.trainData});
@override
Widget build(BuildContext context) {
@ -352,7 +358,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
padding: const EdgeInsets.all(2),
child: Text(
"Ultima informație",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 20 : 22,
fontWeight: FontWeight.bold,
),
@ -365,7 +371,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
padding: const EdgeInsets.all(4),
child: Text(
trainData.status!.station,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 16 : 18,
),
textAlign: TextAlign.left,
@ -378,7 +384,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
padding: const EdgeInsets.all(4),
child: Text(
stateToString(trainData.status!.state),
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 16 : 18,
),
textAlign: TextAlign.right,
@ -413,7 +419,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
return Text(
"$data ${data == 1 ? 'minut' : 'minute'} întârziere",
style:
Theme.of(context).textTheme.bodyMedium?.copyWith(
Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 14 : 16,
color: Colors.red.shade300,
),
@ -422,7 +428,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
return Text(
"${-data} ${data == -1 ? 'minut' : 'minute'} mai devreme",
style:
Theme.of(context).textTheme.bodyMedium?.copyWith(
Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 14 : 16,
color: Colors.green.shade300,
),
@ -525,7 +531,7 @@ class DisplayTrainLastInfo extends StatelessWidget {
class DisplayTrainDestination extends StatelessWidget {
final TrainData trainData;
const DisplayTrainDestination({required this.trainData, super.key,});
DisplayTrainDestination({required this.trainData});
@override
Widget build(BuildContext context) {
@ -542,7 +548,7 @@ class DisplayTrainDestination extends StatelessWidget {
padding: const EdgeInsets.all(4),
child: Text(
"Destinația",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 20 : 22,
fontWeight: FontWeight.bold,
),
@ -553,7 +559,7 @@ class DisplayTrainDestination extends StatelessWidget {
padding: const EdgeInsets.fromLTRB(4, 0, 4, 0),
child: Text(
destination.name,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 20,
fontWeight: FontWeight.w500,
),
@ -586,20 +592,20 @@ class DisplayTrainDestination extends StatelessWidget {
TextSpan(
text: 'la',
children: [
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(
text:
'${arrival.hour.toString().padLeft(2, '0')}:${arrival.minute.toString().padLeft(2, '0')}',
style: delay == 0
? null
: const TextStyle(
: TextStyle(
decoration: TextDecoration.lineThrough,
),
),
if (delay != 0) ...[
const TextSpan(text: ' '),
TextSpan(text: ' '),
TextSpan(
text: arrivalWithDelayString,
text: '$arrivalWithDelayString',
style: TextStyle(
color: delay > 0
? Colors.red.shade300
@ -609,7 +615,7 @@ class DisplayTrainDestination extends StatelessWidget {
]
],
),
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 14 : 16,
),
textAlign: TextAlign.center,
@ -629,7 +635,7 @@ class DisplayTrainDestination extends StatelessWidget {
class DisplayTrainRouteDistance extends StatelessWidget {
final TrainData trainData;
const DisplayTrainRouteDistance({required this.trainData, super.key,});
DisplayTrainRouteDistance({required this.trainData});
@override
Widget build(BuildContext context) {
@ -642,7 +648,7 @@ class DisplayTrainRouteDistance extends StatelessWidget {
children: <Widget>[
Text(
"Distanța rutei",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 20 : 22,
fontWeight: FontWeight.bold,
),
@ -650,7 +656,7 @@ class DisplayTrainRouteDistance extends StatelessWidget {
),
Text(
"${trainData.stations.last.km} km",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 20,
),
textAlign: TextAlign.center,
@ -666,7 +672,7 @@ class DisplayTrainRouteDistance extends StatelessWidget {
class DisplayTrainRouteDuration extends StatelessWidget {
final TrainData trainData;
const DisplayTrainRouteDuration({required this.trainData, super.key,});
DisplayTrainRouteDuration({required this.trainData});
@override
Widget build(BuildContext context) {
@ -679,7 +685,7 @@ class DisplayTrainRouteDuration extends StatelessWidget {
children: <Widget>[
Text(
"Durata rutei",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 20 : 22,
fontWeight: FontWeight.bold,
),
@ -696,11 +702,10 @@ class DisplayTrainRouteDuration extends StatelessWidget {
if (duration.inDays > 0) {
firstWritten = true;
if (duration.inDays == 1) {
if (duration.inDays == 1)
durationString.write("1 zi");
} else {
else
durationString.write("${duration.inDays} zile");
}
duration -= Duration(days: duration.inDays);
}
@ -709,11 +714,10 @@ class DisplayTrainRouteDuration extends StatelessWidget {
durationString.write(", ");
}
firstWritten = true;
if (duration.inHours == 1) {
if (duration.inHours == 1)
durationString.write("1 oră");
} else {
else
durationString.write("${duration.inHours} ore");
}
duration -= Duration(hours: duration.inHours);
}
@ -722,17 +726,16 @@ class DisplayTrainRouteDuration extends StatelessWidget {
durationString.write(", ");
}
firstWritten = true;
if (duration.inMinutes == 1) {
if (duration.inMinutes == 1)
durationString.write("1 minut");
} else {
else
durationString.write("${duration.inMinutes} minute");
}
duration -= Duration(minutes: duration.inMinutes);
}
return Text(
durationString.toString(),
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 20,
),
textAlign: TextAlign.center,
@ -749,7 +752,8 @@ class DisplayTrainRouteDuration extends StatelessWidget {
class DisplayTrainYesterdayWarningMaterial
extends DisplayTrainYesterdayWarningCommon {
const DisplayTrainYesterdayWarningMaterial(super.onViewYesterdayTrain, {super.key,});
DisplayTrainYesterdayWarningMaterial(void Function() onViewYesterdayTrain)
: super(onViewYesterdayTrain);
@override
Widget build(BuildContext context) {
@ -761,13 +765,13 @@ class DisplayTrainYesterdayWarningMaterial
child: Text.rich(
TextSpan(
children: [
const TextSpan(
TextSpan(
text: DisplayTrainYesterdayWarningCommon.trainDidNotDepart,
),
const TextSpan(text: '\n'),
TextSpan(text: '\n'),
TextSpan(
text: DisplayTrainYesterdayWarningCommon.seeYesterdayTrain,
style: const TextStyle(
style: TextStyle(
color: Colors.blue,
),
recognizer: TapGestureRecognizer()
@ -785,7 +789,7 @@ class DisplayTrainYesterdayWarningMaterial
class DisplayTrainStations extends StatelessWidget {
final TrainData trainData;
const DisplayTrainStations({required this.trainData, super.key,});
DisplayTrainStations({required this.trainData});
@override
Widget build(BuildContext context) {
@ -793,7 +797,6 @@ class DisplayTrainStations extends StatelessWidget {
delegate: SliverChildBuilderDelegate(
(context, index) {
return IndexedSemantics(
index: index,
child: DisplayTrainStation(
station: trainData.stations[index],
onTap: () {
@ -803,6 +806,7 @@ class DisplayTrainStations extends StatelessWidget {
);
},
),
index: index,
);
},
childCount: trainData.stations.length,

View file

@ -1,5 +1,5 @@
import 'package:flutter/material.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/train_data.dart';
import 'package:info_tren/components/badge.dart';
import 'package:info_tren/pages/train_info_page/view_train/train_info_material.dart';
@ -7,7 +7,7 @@ class DisplayTrainStation extends StatelessWidget {
final Station station;
final void Function()? onTap;
const DisplayTrainStation({required this.station, this.onTap, super.key,});
DisplayTrainStation({required this.station, this.onTap});
@override
Widget build(BuildContext context) {
@ -52,7 +52,7 @@ class DisplayTrainStation extends StatelessWidget {
final isDelayed = delay > 0 && real == true;
final isOnTime = delay <= 0 && real == true;
const isNotScheduled = false;
final isNotScheduled = false;
return MaterialBadge(
text: station.km.toString(),
@ -96,16 +96,15 @@ class DisplayTrainStation extends StatelessWidget {
class Title extends StatelessWidget {
final Station station;
const Title({
required this.station,
super.key,
Title({
required this.station
});
@override
Widget build(BuildContext context) {
return Text(
station.name,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 22,
fontWeight: MediaQuery.of(context).boldText ? FontWeight.w500 : FontWeight.w300,
// fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal,
@ -118,9 +117,8 @@ class Title extends StatelessWidget {
class Time extends StatelessWidget {
final Station station;
const Time({
Time({
required this.station,
super.key,
});
@override
@ -146,7 +144,7 @@ class Time extends StatelessWidget {
children: <Widget>[
Text(
"",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 22,
),
),
@ -159,7 +157,7 @@ class Time extends StatelessWidget {
Container(width: 2,),
Text(
"",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 22,
),
),
@ -172,10 +170,9 @@ class ArrivalTime extends StatelessWidget {
final Station station;
final bool finalStation;
const ArrivalTime({
ArrivalTime({
required this.station,
this.finalStation = false,
super.key,
});
@override
@ -189,12 +186,12 @@ class ArrivalTime extends StatelessWidget {
children: <Widget>[
Text(
"",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: isSmallScreen(context) ? 18 : 22,
),
),
Container(width: 2,),
const Text("sosire la "),
Text("sosire la "),
ArrivalTime(station: station,),
Expanded(child: Container(),),
],
@ -216,13 +213,13 @@ class ArrivalTime extends StatelessWidget {
children: <Widget>[
Text(
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
decoration: TextDecoration.lineThrough,
),
),
Text(
"${newDate.hour.toString().padLeft(2, '0')}:${newDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
color: Colors.red.shade300,
),
),
@ -238,13 +235,13 @@ class ArrivalTime extends StatelessWidget {
children: <Widget>[
Text(
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
decoration: TextDecoration.lineThrough,
),
),
Text(
"${newDate.hour.toString().padLeft(2, '0')}:${newDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
color: Colors.green.shade300,
),
),
@ -258,9 +255,8 @@ class ArrivalTime extends StatelessWidget {
class StopTime extends StatelessWidget {
final Station station;
const StopTime({
StopTime({
required this.station,
super.key,
});
@override
@ -268,7 +264,7 @@ class StopTime extends StatelessWidget {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
const Text(
Text(
"staționează pentru",
textAlign: TextAlign.center,
),
@ -282,7 +278,7 @@ class StopTime extends StatelessWidget {
}
if (stopsForInt == 1) {
return Text(
"1 ${minutes ? 'minut' : 'secundă'}",
"1 " + (minutes ? 'minut' : 'secundă'),
textAlign: TextAlign.center,
);
}
@ -309,10 +305,9 @@ class DepartureTime extends StatelessWidget {
final Station station;
final bool firstStation;
const DepartureTime({
DepartureTime({
required this.station,
this.firstStation = false,
super.key,
});
@override
@ -325,12 +320,12 @@ class DepartureTime extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(child: Container(),),
const Text("plecare la "),
Text("plecare la "),
DepartureTime(station: station,),
Container(width: 2,),
Text(
"",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
fontSize: 22,
),
),
@ -353,13 +348,13 @@ class DepartureTime extends StatelessWidget {
children: <Widget>[
Text(
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
decoration: TextDecoration.lineThrough,
),
),
Text(
"${newDate.hour.toString().padLeft(2, '0')}:${newDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
color: Colors.red.shade300,
),
),
@ -375,13 +370,13 @@ class DepartureTime extends StatelessWidget {
children: <Widget>[
Text(
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
decoration: TextDecoration.lineThrough,
),
),
Text(
"${newDate.hour.toString().padLeft(2, '0')}:${newDate.minute.toString().padLeft(2, '0')}",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
color: Colors.green.shade300,
),
),
@ -396,9 +391,8 @@ class DepartureTime extends StatelessWidget {
class Delay extends StatelessWidget {
final Station station;
const Delay({
Delay({
required this.station,
super.key,
});
@override
@ -411,12 +405,11 @@ class Delay extends StatelessWidget {
delay = station.departure?.status?.delay;
}
if (delay == 0 || delay == null) {
return Container();
} else if (delay > 0) {
if (delay == 0 || delay == null) return Container();
else if (delay > 0) {
return Text(
"$delay ${delay == 1 ? 'minut' : 'minute'} întârziere",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
color: Colors.red.shade300,
fontSize: 14,
fontStyle: FontStyle.italic,
@ -426,7 +419,7 @@ class Delay extends StatelessWidget {
else if (delay < 0) {
return Text(
"${-delay} ${delay == -1 ? 'minut' : 'minute'} mai devreme",
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
style: Theme.of(context).textTheme.bodyText2?.copyWith(
color: Colors.green.shade300,
fontSize: 14,
fontStyle: FontStyle.italic,

View file

@ -1,11 +1,12 @@
import 'package:flutter/material.dart';
import 'package:info_tren/models.dart';
import 'package:info_tren/stations_list.dart.old';
import 'models/train_data.dart';
class TrainInfoDisplayData extends StatelessWidget {
final TrainData trainData;
const TrainInfoDisplayData(this.trainData, {super.key,});
TrainInfoDisplayData(this.trainData);
@override
Widget build(BuildContext context) {
@ -28,12 +29,12 @@ class TrainInfoDisplayData extends StatelessWidget {
padding: const EdgeInsets.all(4.0),
child: TotalDetails(trainData),
),
const CustomDivider(),
CustomDivider(),
Padding(
padding: const EdgeInsets.all(4.0),
child: Destination(trainData),
),
const CustomDivider(),
CustomDivider(),
Padding(
padding: const EdgeInsets.all(4.0),
child: LastUpdate(trainData),
@ -46,7 +47,7 @@ class TrainInfoDisplayData extends StatelessWidget {
// child: NextStop(trainData),
// ),
// ],
const CustomDivider(),
CustomDivider(),
Padding(
padding: const EdgeInsets.all(4.0),
child: TrainStatus(trainData),
@ -57,11 +58,11 @@ class TrainInfoDisplayData extends StatelessWidget {
child: StationsList(trainData),
),
SafeArea(
child: Container(),
bottom: true,
left: false,
right: false,
top: false,
child: Container(),
)
],
),
@ -72,20 +73,20 @@ class TrainInfoDisplayData extends StatelessWidget {
class TrainName extends StatelessWidget {
final TrainData trainData;
const TrainName(this.trainData, {super.key,});
TrainName(this.trainData);
@override
Widget build(BuildContext context) {
return Text(
"${trainData.rank} ${trainData.number}",
style: Theme.of(context).textTheme.displaySmall,
style: Theme.of(context).textTheme.headline3,
);
}
}
class TrainRoute extends StatelessWidget {
final TrainData trainData;
const TrainRoute(this.trainData, {super.key,});
TrainRoute(this.trainData);
@override
Widget build(BuildContext context) {
@ -95,19 +96,19 @@ class TrainRoute extends StatelessWidget {
Expanded(
child: Text(
trainData.route.from,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(fontStyle: FontStyle.italic),
style: Theme.of(context).textTheme.bodyText1?.copyWith(fontStyle: FontStyle.italic),
textAlign: TextAlign.left,
),
),
Text(
"-",
style: Theme.of(context).textTheme.bodyLarge?.copyWith(fontStyle: FontStyle.italic),
style: Theme.of(context).textTheme.bodyText1?.copyWith(fontStyle: FontStyle.italic),
textAlign: TextAlign.center,
),
Expanded(
child: Text(
trainData.route.to,
style: Theme.of(context).textTheme.bodyLarge?.copyWith(fontStyle: FontStyle.italic),
style: Theme.of(context).textTheme.bodyText1?.copyWith(fontStyle: FontStyle.italic),
textAlign: TextAlign.right,
),
),
@ -118,13 +119,13 @@ class TrainRoute extends StatelessWidget {
class TrainOperator extends StatelessWidget {
final TrainData trainData;
const TrainOperator(this.trainData, {super.key,});
TrainOperator(this.trainData);
@override
Widget build(BuildContext context) {
return Text(
"Operat de ${trainData.operator}",
style: Theme.of(context).textTheme.bodyMedium,
style: Theme.of(context).textTheme.bodyText2,
textAlign: TextAlign.center,
);
}
@ -132,21 +133,21 @@ class TrainOperator extends StatelessWidget {
class TrainStatus extends StatelessWidget {
final TrainData trainData;
const TrainStatus(this.trainData, {super.key,});
TrainStatus(this.trainData);
@override
Widget build(BuildContext context) {
return Text(
trainData.status.toString(),
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headlineSmall,
style: Theme.of(context).textTheme.headline5,
);
}
}
class Destination extends StatelessWidget {
final TrainData trainData;
const Destination(this.trainData, {super.key,});
Destination(this.trainData);
@override
Widget build(BuildContext context) {
@ -169,7 +170,7 @@ class Destination extends StatelessWidget {
class LastUpdate extends StatelessWidget {
final TrainData trainData;
const LastUpdate(this.trainData, {super.key,});
LastUpdate(this.trainData);
@override
Widget build(BuildContext context) {
@ -181,7 +182,7 @@ class LastUpdate extends StatelessWidget {
children: <Widget>[
Padding(
padding: const EdgeInsets.all(2.0),
child: Text("Ultima informație", style: Theme.of(context).textTheme.headlineSmall,),
child: Text("Ultima informație", style: Theme.of(context).textTheme.headline5,),
),
Row(
children: <Widget>[
@ -199,10 +200,10 @@ class LastUpdate extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(2.0),
child: trainData.status!.delay == 0
? Text("Fără întârziere", style: Theme.of(context).textTheme.bodySmall,)
? Text("Fără întârziere", style: Theme.of(context).textTheme.caption,)
: trainData.status!.delay > 0
? Text("${trainData.status!.delay} minute întârziere", style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Colors.red.shade700),)
: Text("${-(trainData.status!.delay)} minute mai devreme", style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: Colors.green.shade700),)
? Text("${trainData.status!.delay} minute întârziere", style: Theme.of(context).textTheme.bodyText2?.copyWith(color: Colors.red.shade700),)
: Text("${-(trainData.status!.delay)} minute mai devreme", style: Theme.of(context).textTheme.bodyText2?.copyWith(color: Colors.green.shade700),)
),
// TODO: Implement status report time detection
// Padding(
@ -247,7 +248,7 @@ class LastUpdate extends StatelessWidget {
class TotalDetails extends StatelessWidget {
final TrainData trainData;
const TotalDetails(this.trainData, {super.key,});
TotalDetails(this.trainData);
@override
Widget build(BuildContext context) {
@ -255,7 +256,7 @@ class TotalDetails extends StatelessWidget {
children: <Widget>[
Text(
'${trainData.stations.last.km} km',
style: Theme.of(context).textTheme.bodySmall,
style: Theme.of(context).textTheme.caption,
textAlign: TextAlign.left,
),
Expanded(
@ -272,15 +273,13 @@ class TotalDetails extends StatelessWidget {
}
class CustomDivider extends StatelessWidget {
const CustomDivider({super.key});
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(height: 4,),
const Divider(),
Divider(),
Container(height: 4,),
],
);

View file

@ -1,6 +1,6 @@
import 'dart:io';
import 'package:info_tren/models.dart';
import 'package:info_tren/models/ui_design.dart';
UiDesign get defaultUiDesign {
if (Platform.isIOS) {

View file

@ -1,12 +1,12 @@
import 'package:info_tren/models.dart';
import 'package:info_tren/models/train_data.dart';
String stateToString(TrainDataState state) {
String stateToString(State state) {
switch(state) {
case TrainDataState.PASSING:
case State.PASSING:
return 'trecere fără oprire';
case TrainDataState.ARRIVAL:
case State.ARRIVAL:
return 'sosire';
case TrainDataState.DEPARTURE:
case State.DEPARTURE:
return 'plecare';
}
}

View file

@ -2,12 +2,9 @@ extension TakeWhile on String {
String takeWhile(Function charValidator) {
StringBuffer output = StringBuffer();
for (final char in codeUnits) {
if (charValidator(char)) {
output.writeCharCode(char);
} else {
break;
}
for (final char in this.codeUnits) {
if (charValidator(char)) output.writeCharCode(char);
else break;
}
return output.toString();

View file

@ -7,14 +7,14 @@ packages:
name: _fe_analyzer_shared
url: "https://pub.dartlang.org"
source: hosted
version: "50.0.0"
version: "31.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.0"
version: "2.8.0"
args:
dependency: transitive
description:
@ -28,21 +28,21 @@ packages:
name: async
url: "https://pub.dartlang.org"
source: hosted
version: "2.10.0"
version: "2.9.0"
build:
dependency: transitive
description:
name: build
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.1"
version: "2.3.0"
build_config:
dependency: transitive
description:
name: build_config
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
version: "1.0.0"
build_daemon:
dependency: transitive
description:
@ -56,21 +56,21 @@ packages:
name: build_resolvers
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
version: "2.0.6"
build_runner:
dependency: "direct dev"
description:
name: build_runner
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.2"
version: "2.1.11"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
url: "https://pub.dartlang.org"
source: hosted
version: "7.2.7"
version: "7.2.2"
built_collection:
dependency: transitive
description:
@ -84,14 +84,14 @@ packages:
name: built_value
url: "https://pub.dartlang.org"
source: hosted
version: "8.4.2"
version: "8.4.0"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
version: "1.2.0"
checked_yaml:
dependency: transitive
description:
@ -99,13 +99,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
cli_util:
dependency: transitive
description:
name: cli_util
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.5"
code_builder:
dependency: transitive
description:
name: code_builder
url: "https://pub.dartlang.org"
source: hosted
version: "4.3.0"
version: "4.2.0"
collection:
dependency: transitive
description:
@ -119,7 +126,7 @@ packages:
name: convert
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
version: "3.0.2"
crypto:
dependency: transitive
description:
@ -140,7 +147,7 @@ packages:
name: dart_style
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.4"
version: "2.2.1"
ffi:
dependency: transitive
description:
@ -154,7 +161,7 @@ packages:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
version: "6.1.2"
fixnum:
dependency: transitive
description:
@ -167,53 +174,25 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_hooks:
flutter_redux:
dependency: "direct main"
description:
name: flutter_hooks
name: flutter_redux
url: "https://pub.dartlang.org"
source: hosted
version: "0.18.5+1"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
flutter_riverpod:
dependency: transitive
description:
name: flutter_riverpod
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
version: "0.8.2"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
freezed:
dependency: "direct dev"
description:
name: freezed
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
freezed_annotation:
dependency: "direct main"
description:
name: freezed_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
version: "2.1.3"
glob:
dependency: transitive
description:
@ -227,21 +206,14 @@ packages:
name: graphs
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
hooks_riverpod:
dependency: "direct main"
description:
name: hooks_riverpod
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
version: "2.1.0"
http:
dependency: "direct main"
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
version: "0.13.4"
http_multi_server:
dependency: transitive
description:
@ -255,7 +227,7 @@ packages:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
version: "4.0.1"
io:
dependency: transitive
description:
@ -271,54 +243,47 @@ packages:
source: hosted
version: "0.6.4"
json_annotation:
dependency: "direct main"
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "4.7.0"
version: "4.1.0"
json_serializable:
dependency: "direct dev"
description:
name: json_serializable
url: "https://pub.dartlang.org"
source: hosted
version: "6.5.4"
lints:
dependency: transitive
description:
name: lints
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "5.0.2"
logging:
dependency: transitive
description:
name: logging
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
version: "1.0.2"
matcher:
dependency: transitive
description:
name: matcher
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.13"
version: "0.12.12"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0"
version: "0.1.4"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0"
version: "1.7.0"
mime:
dependency: transitive
description:
@ -339,14 +304,42 @@ packages:
name: package_info_plus
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
version: "1.4.3"
package_info_plus_linux:
dependency: transitive
description:
name: package_info_plus_linux
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
package_info_plus_macos:
dependency: transitive
description:
name: package_info_plus_macos
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
package_info_plus_platform_interface:
dependency: transitive
description:
name: package_info_plus_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "1.0.2"
package_info_plus_web:
dependency: transitive
description:
name: package_info_plus_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.5"
package_info_plus_windows:
dependency: transitive
description:
name: package_info_plus_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
path:
dependency: transitive
description:
@ -360,7 +353,7 @@ packages:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
version: "2.1.2"
pool:
dependency: transitive
description:
@ -374,14 +367,14 @@ packages:
name: pub_semver
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
version: "2.1.1"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.1"
version: "1.1.0"
quiver:
dependency: "direct main"
description:
@ -389,20 +382,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
riverpod:
redux:
dependency: transitive
description:
name: riverpod
name: redux
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
version: "5.0.0"
rxdart:
dependency: "direct main"
description:
name: rxdart
url: "https://pub.dartlang.org"
source: hosted
version: "0.22.6"
shelf:
dependency: transitive
description:
name: shelf
url: "https://pub.dartlang.org"
source: hosted
version: "1.4.0"
version: "1.3.2"
shelf_web_socket:
dependency: transitive
description:
@ -421,14 +421,14 @@ packages:
name: source_gen
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.6"
version: "1.2.2"
source_helper:
dependency: transitive
description:
name: source_helper
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.3"
version: "1.3.2"
source_span:
dependency: transitive
description:
@ -442,35 +442,28 @@ packages:
name: sprintf
url: "https://pub.dartlang.org"
source: hosted
version: "7.0.0"
version: "6.0.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
url: "https://pub.dartlang.org"
source: hosted
version: "1.11.0"
state_notifier:
dependency: transitive
description:
name: state_notifier
url: "https://pub.dartlang.org"
source: hosted
version: "0.7.2+1"
version: "1.10.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
stream_transform:
dependency: transitive
description:
name: stream_transform
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "2.0.0"
string_scanner:
dependency: transitive
description:
@ -498,7 +491,7 @@ packages:
name: tuple
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
version: "2.0.0"
typed_data:
dependency: transitive
description:
@ -512,14 +505,14 @@ packages:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.6"
version: "6.1.5"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.21"
version: "6.0.17"
url_launcher_ios:
dependency: transitive
description:
@ -547,14 +540,14 @@ packages:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
version: "2.1.0"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.13"
version: "2.0.12"
url_launcher_windows:
dependency: transitive
description:
@ -568,14 +561,14 @@ packages:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
version: "2.1.2"
watcher:
dependency: transitive
description:
name: watcher
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
version: "1.0.1"
web_socket_channel:
dependency: transitive
description:
@ -589,7 +582,7 @@ packages:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
version: "2.7.0"
yaml:
dependency: transitive
description:
@ -598,5 +591,5 @@ packages:
source: hosted
version: "3.1.1"
sdks:
dart: ">=2.18.0 <3.0.0"
flutter: ">=3.0.0"
dart: ">=2.17.0 <3.0.0"
flutter: ">=2.10.0"

View file

@ -14,32 +14,29 @@ description: O aplicație de vizualizare a datelor puse la dispoziție de Inform
version: 2.7.8
environment:
sdk: ">=2.17.0 <3.0.0"
sdk: ">=2.15.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.5
rxdart: ^0.22.0
http: ^0.13.0
tuple: ^2.0.0
sprintf: ^7.0.0
package_info_plus: ^3.0.1
sprintf: ^6.0.0
flutter_redux: ^0.8.2
package_info_plus: ^1.4.3
quiver: ^3.1.0
url_launcher: ^6.1.5
flutter_hooks: ^0.18.5+1
hooks_riverpod: ^2.0.2
freezed_annotation: ^2.2.0
json_annotation: ^4.7.0
dev_dependencies:
# flutter_test:
# sdk: flutter
build_runner: ^2.1.0
json_serializable: ^6.5.4
freezed: 2.2.0
flutter_lints: ^2.0.1
json_serializable: ^5.0.0
# For information on the generic Dart part of this file, see the

30
test/widget_test.dart Normal file
View file

@ -0,0 +1,30 @@
// This is a basic Flutter widget test.
//
// To perform an interaction with a widget in your test, use the WidgetTester
// utility in the flutter_test package. For example, you can send tap and scroll
// gestures. You can also use WidgetTester to find child widgets in the widget
// tree, read text, and verify that the values of widget properties are correct.
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:info_tren/main.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(const MyApp());
// Verify that our counter starts at 0.
expect(find.text('0'), findsOneWidget);
expect(find.text('1'), findsNothing);
// Tap the '+' icon and trigger a frame.
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
// Verify that our counter has incremented.
expect(find.text('0'), findsNothing);
expect(find.text('1'), findsOneWidget);
});
}