You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
254 lines
6.8 KiB
254 lines
6.8 KiB
import 'package:flutter/material.dart'; |
|
import 'package:flutter/cupertino.dart'; |
|
import 'package:info_tren/train_info_page/train_info_constants.dart'; |
|
|
|
import 'dart:io' show Platform; |
|
|
|
class AnimatedBackground extends StatefulWidget { |
|
final Color initialColor; |
|
final Color backgroundColor; |
|
final Widget child; |
|
final Duration animationDuration; |
|
|
|
AnimatedBackground({Key key, @required this.initialColor, @required this.backgroundColor, Duration animationDuration, @required this.child}) |
|
: this.animationDuration = animationDuration ?? Duration(milliseconds: 250) |
|
, super(key: key); |
|
|
|
@override |
|
State<AnimatedBackground> createState() => _AnimatedBackgroundState(); |
|
} |
|
|
|
class _AnimatedBackgroundState extends State<AnimatedBackground> with SingleTickerProviderStateMixin { |
|
AnimationController controller; |
|
Animatable<Color> animation; |
|
|
|
@override |
|
void initState() { |
|
super.initState(); |
|
controller = AnimationController(vsync: this, duration: widget.animationDuration); |
|
controller.forward(); |
|
animation = ColorTween(begin: widget.initialColor, end: widget.backgroundColor); |
|
} |
|
|
|
@override |
|
void didUpdateWidget(AnimatedBackground oldWidget) { |
|
super.didUpdateWidget(oldWidget); |
|
|
|
if (oldWidget.backgroundColor != widget.backgroundColor) { |
|
controller = AnimationController( |
|
duration: widget.animationDuration, |
|
vsync: this |
|
); |
|
controller.forward(); |
|
|
|
animation = ColorTween( |
|
begin: oldWidget.backgroundColor, |
|
end: widget.backgroundColor |
|
); |
|
} |
|
} |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
return AnimatedBuilder( |
|
animation: controller, |
|
child: widget.child, |
|
builder: (context, child) { |
|
return Container( |
|
decoration: BoxDecoration( |
|
color: animation.evaluate(controller), |
|
), |
|
child: child, |
|
); |
|
}, |
|
); |
|
} |
|
} |
|
|
|
class ProgressReportDisplayEntry extends StatefulWidget { |
|
final bool completed; |
|
final String waitingText; |
|
final String completedText; |
|
String get text => completed ? completedText : waitingText; |
|
|
|
ProgressReportDisplayEntry({Key key, @required this.completed, @required this.waitingText, @required this.completedText}): super(key: key); |
|
|
|
@override |
|
State<ProgressReportDisplayEntry> createState() { |
|
if (Platform.isIOS) { |
|
return _ProgressReportDisplayEntryCupertinoState(); |
|
} |
|
else if (Platform.isAndroid) { |
|
return _ProgressReportDisplayEntryMaterialState(); |
|
} |
|
else return null; |
|
} |
|
} |
|
|
|
class _ProgressReportDisplayEntryCupertinoState extends State<ProgressReportDisplayEntry> with SingleTickerProviderStateMixin { |
|
Animatable<Color> background; |
|
Animatable<Color> checkMark; |
|
AnimationController _controller; |
|
|
|
initAnimation() { |
|
background = ColorTween( |
|
begin: CupertinoTheme.of(context).scaffoldBackgroundColor, |
|
end: BACKGROUND_GREEN, |
|
); |
|
checkMark = ColorTween( |
|
begin: FOREGROUND_WHITE, |
|
end: FOREGROUND_GREEN, |
|
); |
|
} |
|
|
|
@override |
|
void initState() { |
|
super.initState(); |
|
|
|
_controller = AnimationController( |
|
duration: const Duration(milliseconds: 250), |
|
vsync: this, |
|
); |
|
_controller.value = widget.completed ? 1 : 0; |
|
} |
|
|
|
@override |
|
void didChangeDependencies() { |
|
super.didChangeDependencies(); |
|
initAnimation(); |
|
} |
|
|
|
@override |
|
void didUpdateWidget(ProgressReportDisplayEntry oldWidget) { |
|
super.didUpdateWidget(oldWidget); |
|
if (oldWidget.completed != widget.completed) { |
|
if (widget.completed) { |
|
_controller.forward(); |
|
} |
|
else { |
|
_controller.reverse(); |
|
} |
|
} |
|
} |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
return AnimatedBuilder( |
|
animation: _controller, |
|
builder: (context, _) { |
|
return Container( |
|
decoration: BoxDecoration( |
|
color: background.evaluate(_controller) |
|
), |
|
child: Row( |
|
children: <Widget>[ |
|
Center( |
|
child: Padding( |
|
padding: const EdgeInsets.all(4), |
|
child: Container( |
|
width: 32, |
|
height: 32, |
|
child: |
|
!widget.completed |
|
? CupertinoActivityIndicator() |
|
: Icon(CupertinoIcons.check_mark_circled, color: checkMark.evaluate(_controller)), |
|
), |
|
), |
|
), |
|
Expanded( |
|
child: Padding( |
|
padding: const EdgeInsets.all(4), |
|
child: Text(widget.text), |
|
), |
|
) |
|
], |
|
), |
|
); |
|
} |
|
); |
|
} |
|
} |
|
|
|
class _ProgressReportDisplayEntryMaterialState extends State<ProgressReportDisplayEntry> with SingleTickerProviderStateMixin { |
|
Animatable<Color> background; |
|
Animatable<Color> checkMark; |
|
AnimationController _controller; |
|
|
|
initAnimation() { |
|
background = ColorTween( |
|
begin: Theme.of(context).scaffoldBackgroundColor, |
|
end: Colors.green, |
|
); |
|
checkMark = ColorTween( |
|
begin: Colors.white, |
|
end: Colors.greenAccent, |
|
); |
|
} |
|
|
|
@override |
|
void initState() { |
|
super.initState(); |
|
|
|
_controller = AnimationController( |
|
duration: const Duration(milliseconds: 250), |
|
vsync: this, |
|
); |
|
_controller.value = widget.completed ? 1 : 0; |
|
} |
|
|
|
@override |
|
void didChangeDependencies() { |
|
super.didChangeDependencies(); |
|
initAnimation(); |
|
} |
|
|
|
@override |
|
void didUpdateWidget(ProgressReportDisplayEntry oldWidget) { |
|
super.didUpdateWidget(oldWidget); |
|
if (oldWidget.completed != widget.completed) { |
|
if (widget.completed) { |
|
_controller.forward(); |
|
} |
|
else { |
|
_controller.reverse(); |
|
} |
|
} |
|
} |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
return AnimatedBuilder( |
|
animation: _controller, |
|
builder: (context, _) { |
|
return Container( |
|
decoration: BoxDecoration( |
|
color: background.evaluate(_controller) |
|
), |
|
child: Row( |
|
children: <Widget>[ |
|
Center( |
|
child: Padding( |
|
padding: const EdgeInsets.all(4), |
|
child: Container( |
|
width: 32, |
|
height: 32, |
|
child: |
|
!widget.completed |
|
? CircularProgressIndicator(strokeWidth: 2, valueColor: AlwaysStoppedAnimation(Colors.orangeAccent),) |
|
: Icon(Icons.check_circle, color: checkMark.evaluate(_controller), size: 32,), |
|
), |
|
), |
|
), |
|
Expanded( |
|
child: Padding( |
|
padding: const EdgeInsets.all(4), |
|
child: Text(widget.text), |
|
), |
|
) |
|
], |
|
), |
|
); |
|
} |
|
); |
|
} |
|
} |