|
|
@ -24,8 +24,8 @@ class DisplayTrainStation extends StatelessWidget { |
|
|
|
station.observations, |
|
|
|
station.observations, |
|
|
|
]), |
|
|
|
]), |
|
|
|
builder: (context, data) { |
|
|
|
builder: (context, data) { |
|
|
|
final isDelayed = (data[0] as int) > 0; |
|
|
|
final isDelayed = (data[0] as int) > 0 && (data[1] as RealOrEstimate) == RealOrEstimate.real; |
|
|
|
final isOnTime = !isDelayed && (data[1] as RealOrEstimate) == RealOrEstimate.real; |
|
|
|
final isOnTime = (data[0] as int) <= 0 && (data[1] as RealOrEstimate) == RealOrEstimate.real; |
|
|
|
final isNotScheduled = data[2] == "ONI"; |
|
|
|
final isNotScheduled = data[2] == "ONI"; |
|
|
|
|
|
|
|
|
|
|
|
return KmBadge( |
|
|
|
return KmBadge( |
|
|
@ -37,162 +37,18 @@ class DisplayTrainStation extends StatelessWidget { |
|
|
|
} |
|
|
|
} |
|
|
|
), |
|
|
|
), |
|
|
|
Expanded( |
|
|
|
Expanded( |
|
|
|
child: FutureDisplay<List<String>>( |
|
|
|
child: Title( |
|
|
|
future: Future.wait([ |
|
|
|
station: station, |
|
|
|
station.stationName, |
|
|
|
), |
|
|
|
station.observations |
|
|
|
|
|
|
|
]), |
|
|
|
|
|
|
|
builder: (context, items) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
items[0], |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
fontWeight: FontWeight.w100, |
|
|
|
|
|
|
|
fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
) |
|
|
|
) |
|
|
|
], |
|
|
|
], |
|
|
|
), |
|
|
|
), |
|
|
|
FutureDisplay<List<String>>( |
|
|
|
Time( |
|
|
|
future: Future.wait([ |
|
|
|
station: station, |
|
|
|
station.arrivalTime, |
|
|
|
), |
|
|
|
station.stopsFor, |
|
|
|
Delay( |
|
|
|
station.departureTime |
|
|
|
station: station, |
|
|
|
]), |
|
|
|
|
|
|
|
builder: (context, items) { |
|
|
|
|
|
|
|
if (items[0].isEmpty) { |
|
|
|
|
|
|
|
// Plecare |
|
|
|
|
|
|
|
return Row( |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
Text("plecare la ${items[2]}"), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (items[2].isEmpty) { |
|
|
|
|
|
|
|
// Sosire |
|
|
|
|
|
|
|
return Row( |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text("sosire la ${items[0]}"), |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Row( |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text(items[0]), |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
Column( |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Builder( |
|
|
|
|
|
|
|
builder: (context) { |
|
|
|
|
|
|
|
if (items[1].isEmpty || items[1] == "0") { |
|
|
|
|
|
|
|
return Container(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (items[1] == "1") { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"staționează pentru\n1 minut", |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"staționează pentru\n${items[1]} minute", |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
FutureBuilder<String>( |
|
|
|
|
|
|
|
future: station.observations, |
|
|
|
|
|
|
|
builder: (context, snapshot) { |
|
|
|
|
|
|
|
if (snapshot.data == "ONI") { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"oprire ne-itinerarică", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontStyle: FontStyle.italic, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Container(); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
Text(items[2]), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
), |
|
|
|
), |
|
|
|
FutureDisplay<int>( |
|
|
|
|
|
|
|
future: station.delay, |
|
|
|
|
|
|
|
builder: (context, delay) { |
|
|
|
|
|
|
|
if (delay == 0) return Container(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (delay > 0) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"$delay minute întârziere", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.destructiveRed, |
|
|
|
|
|
|
|
fontSize: 12, |
|
|
|
|
|
|
|
fontStyle: FontStyle.italic, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (delay < 0) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"${-delay} minute mai devreme", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.activeGreen, |
|
|
|
|
|
|
|
fontSize: 12, |
|
|
|
|
|
|
|
fontStyle: FontStyle.italic, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Container(); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
], |
|
|
|
], |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
@ -277,3 +133,412 @@ class KmBadge extends StatelessWidget { |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Title extends StatelessWidget { |
|
|
|
|
|
|
|
final OnDemandStation station; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Title({ |
|
|
|
|
|
|
|
@required this.station |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
|
|
return FutureDisplay<List<String>>( |
|
|
|
|
|
|
|
future: Future.wait([ |
|
|
|
|
|
|
|
station.stationName, |
|
|
|
|
|
|
|
station.observations |
|
|
|
|
|
|
|
]), |
|
|
|
|
|
|
|
builder: (context, items) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
items[0], |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
fontWeight: FontWeight.w100, |
|
|
|
|
|
|
|
fontStyle: items[1] == "ONI" ? FontStyle.italic : FontStyle.normal, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Time extends StatelessWidget { |
|
|
|
|
|
|
|
final OnDemandStation station; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Time({ |
|
|
|
|
|
|
|
@required this.station, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
|
|
return FutureDisplay<List<String>>( |
|
|
|
|
|
|
|
future: Future.wait([ |
|
|
|
|
|
|
|
station.arrivalTime, |
|
|
|
|
|
|
|
station.stopsFor, |
|
|
|
|
|
|
|
station.departureTime, |
|
|
|
|
|
|
|
]), |
|
|
|
|
|
|
|
builder: (context, items) { |
|
|
|
|
|
|
|
if (items[0].isEmpty) { |
|
|
|
|
|
|
|
// Plecare |
|
|
|
|
|
|
|
return DepartureTime( |
|
|
|
|
|
|
|
station: station, |
|
|
|
|
|
|
|
firstStation: true, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (items[2].isEmpty) { |
|
|
|
|
|
|
|
// Sosire |
|
|
|
|
|
|
|
return ArrivalTime( |
|
|
|
|
|
|
|
station: station, |
|
|
|
|
|
|
|
finalStation: true, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Row( |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
ArrivalTime(station: station,), |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
// Column( |
|
|
|
|
|
|
|
// mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
// children: <Widget>[ |
|
|
|
|
|
|
|
// Builder( |
|
|
|
|
|
|
|
// builder: (context) { |
|
|
|
|
|
|
|
// if (items[1].isEmpty || items[1] == "0") { |
|
|
|
|
|
|
|
// return Container(); |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// if (items[1] == "1") { |
|
|
|
|
|
|
|
// return Text( |
|
|
|
|
|
|
|
// "staționează pentru\n1 minut", |
|
|
|
|
|
|
|
// textAlign: TextAlign.center, |
|
|
|
|
|
|
|
// ); |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// return Text( |
|
|
|
|
|
|
|
// "staționează pentru\n${items[1]} minute", |
|
|
|
|
|
|
|
// textAlign: TextAlign.center, |
|
|
|
|
|
|
|
// ); |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// FutureBuilder<String>( |
|
|
|
|
|
|
|
// future: station.observations, |
|
|
|
|
|
|
|
// builder: (context, snapshot) { |
|
|
|
|
|
|
|
// if (snapshot.data == "ONI") { |
|
|
|
|
|
|
|
// return Text( |
|
|
|
|
|
|
|
// "oprire ne-itinerarică", |
|
|
|
|
|
|
|
// style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
// fontStyle: FontStyle.italic, |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
// textAlign: TextAlign.center, |
|
|
|
|
|
|
|
// ); |
|
|
|
|
|
|
|
// } |
|
|
|
|
|
|
|
// |
|
|
|
|
|
|
|
// return Container(); |
|
|
|
|
|
|
|
// }, |
|
|
|
|
|
|
|
// ) |
|
|
|
|
|
|
|
// ], |
|
|
|
|
|
|
|
// ), |
|
|
|
|
|
|
|
StopTime(station: station,), |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
DepartureTime(station: station,), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ArrivalTime extends StatelessWidget { |
|
|
|
|
|
|
|
final OnDemandStation station; |
|
|
|
|
|
|
|
final bool finalStation; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ArrivalTime({ |
|
|
|
|
|
|
|
@required this.station, |
|
|
|
|
|
|
|
this.finalStation = false, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
|
|
return FutureDisplay<List<Object>>( |
|
|
|
|
|
|
|
future: Future.wait([ |
|
|
|
|
|
|
|
station.arrivalTime, |
|
|
|
|
|
|
|
station.delay, |
|
|
|
|
|
|
|
]), |
|
|
|
|
|
|
|
builder: (context, data) { |
|
|
|
|
|
|
|
if (finalStation) { |
|
|
|
|
|
|
|
return Row( |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text("sosire la "), |
|
|
|
|
|
|
|
ArrivalTime(station: station,), |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
if (data[1] == 0) { |
|
|
|
|
|
|
|
return Text("${data[0]}"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (data[1] as int > 0) { |
|
|
|
|
|
|
|
final splits = (data[0] as String).split(":").map((s) => int.parse(s)).toList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final now = DateTime.now(); |
|
|
|
|
|
|
|
final newDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]); |
|
|
|
|
|
|
|
final oldDate = newDate.subtract(Duration(minutes: data[1] as int)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Column( |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
decoration: TextDecoration.lineThrough, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${data[0]}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.destructiveRed, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
final splits = (data[0] as String).split(":").map((s) => int.parse(s)).toList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final now = DateTime.now(); |
|
|
|
|
|
|
|
final newDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]); |
|
|
|
|
|
|
|
final oldDate = newDate.subtract(Duration(minutes: data[1] as int)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Column( |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
decoration: TextDecoration.lineThrough, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${data[0]}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.activeGreen, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class StopTime extends StatelessWidget { |
|
|
|
|
|
|
|
final OnDemandStation station; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
StopTime({ |
|
|
|
|
|
|
|
@required this.station, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
|
|
return FutureDisplay<String>( |
|
|
|
|
|
|
|
future: station.stopsFor, |
|
|
|
|
|
|
|
builder: (context, stopsFor) { |
|
|
|
|
|
|
|
return Column( |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"staționează pentru", |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Builder( |
|
|
|
|
|
|
|
builder: (context) { |
|
|
|
|
|
|
|
int stopsForInt = int.parse(stopsFor); |
|
|
|
|
|
|
|
if (stopsForInt == 1) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"1 minut", |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (stopsForInt < 20) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"$stopsFor minute", |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"$stopsFor de minute", |
|
|
|
|
|
|
|
textAlign: TextAlign.center, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DepartureTime extends StatelessWidget { |
|
|
|
|
|
|
|
final OnDemandStation station; |
|
|
|
|
|
|
|
final bool firstStation; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DepartureTime({ |
|
|
|
|
|
|
|
@required this.station, |
|
|
|
|
|
|
|
this.firstStation = false, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
|
|
return FutureDisplay<List<Object>>( |
|
|
|
|
|
|
|
future: Future.wait([ |
|
|
|
|
|
|
|
station.departureTime, |
|
|
|
|
|
|
|
station.delay, |
|
|
|
|
|
|
|
]), |
|
|
|
|
|
|
|
builder: (context, data) { |
|
|
|
|
|
|
|
if (firstStation) { |
|
|
|
|
|
|
|
return Row( |
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.center, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Expanded(child: Container(),), |
|
|
|
|
|
|
|
Text("plecare la "), |
|
|
|
|
|
|
|
DepartureTime(station: station,), |
|
|
|
|
|
|
|
Container(width: 2,), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"→", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
fontSize: 22, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
if (data[1] == 0) { |
|
|
|
|
|
|
|
return Text("${data[0]}"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else if (data[1] as int > 0) { |
|
|
|
|
|
|
|
final splits = (data[0] as String).split(":").map((s) => int.parse(s)).toList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final now = DateTime.now(); |
|
|
|
|
|
|
|
final newDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]); |
|
|
|
|
|
|
|
final oldDate = newDate.subtract(Duration(minutes: data[1] as int)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Column( |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
decoration: TextDecoration.lineThrough, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${data[0]}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.destructiveRed, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
final splits = (data[0] as String).split(":").map((s) => int.parse(s)).toList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final now = DateTime.now(); |
|
|
|
|
|
|
|
final newDate = DateTime(now.year, now.month, now.day, splits[0], splits[1]); |
|
|
|
|
|
|
|
final oldDate = newDate.subtract(Duration(minutes: data[1] as int)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Column( |
|
|
|
|
|
|
|
mainAxisSize: MainAxisSize.min, |
|
|
|
|
|
|
|
children: <Widget>[ |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${oldDate.hour.toString().padLeft(2, '0')}:${oldDate.minute.toString().padLeft(2, '0')}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
decoration: TextDecoration.lineThrough, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
Text( |
|
|
|
|
|
|
|
"${data[0]}", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.activeGreen, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
], |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Delay extends StatelessWidget { |
|
|
|
|
|
|
|
final OnDemandStation station; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Delay({ |
|
|
|
|
|
|
|
@required this.station, |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override |
|
|
|
|
|
|
|
Widget build(BuildContext context) { |
|
|
|
|
|
|
|
return FutureDisplay<int>( |
|
|
|
|
|
|
|
future: station.delay, |
|
|
|
|
|
|
|
builder: (context, delay) { |
|
|
|
|
|
|
|
if (delay == 0) return Container(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (delay > 0) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"$delay minute întârziere", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.destructiveRed, |
|
|
|
|
|
|
|
fontSize: 12, |
|
|
|
|
|
|
|
fontStyle: FontStyle.italic, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
else if (delay < 0) { |
|
|
|
|
|
|
|
return Text( |
|
|
|
|
|
|
|
"${-delay} minute mai devreme", |
|
|
|
|
|
|
|
style: CupertinoTheme.of(context).textTheme.textStyle.copyWith( |
|
|
|
|
|
|
|
color: CupertinoColors.activeGreen, |
|
|
|
|
|
|
|
fontSize: 12, |
|
|
|
|
|
|
|
fontStyle: FontStyle.italic, |
|
|
|
|
|
|
|
), |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Container(); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|