我怎么能给一个变量从一个类到另一个,并返回改变的变量回来?



我是新的扑动,我正试图从SetTimerPage到CupertinoTimePickerButton-Page的倒计时变量。然后把它改到选定的时间,然后还给它。接下来,我想给改变倒计时到下一页,其中一个倒计时动画开始。我也愿意听取建议来改进我的语法。谢谢你:)

void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.red,
),
home: SetTimerPage(),
);
}
}
class SetTimerPage extends StatefulWidget {
@override
_SetTimerPageState createState() => _SetTimerPageState();
}
class _SetTimerPageState extends State<SetTimerPage> {
final Duration countdown = Duration(minutes: 0, seconds: 0);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('RoundONE'),
),
body: Container(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
CustomRowWidget(
icon: Icons.alarm_sharp,
text: 'COUNTDOWN',
button: CupertinoTimePickerButton(passedValue: countdown),
),
StartButton(countdown: countdown),
],
),
),
);
}
}
class CupertinoTimePickerButton extends StatefulWidget {
Duration passedValue;
CupertinoTimePickerButton({
Key key,
@required this.passedValue,
}) : super(key: key);
@override
_CupertinoTimePickerButtonState createState() =>
_CupertinoTimePickerButtonState();
}
class _CupertinoTimePickerButtonState extends State<CupertinoTimePickerButton> {
@override
Widget build(BuildContext context) {
return MaterialButton(
child: Text(
_formatDuration(widget.passedValue),
style: TextStyle(color: Colors.white),
),
color: Colors.redAccent,
onPressed: () {
_cupertinoTimeSetter(context);
},
);
}
Future _cupertinoTimeSetter(BuildContext context) {
return showModalBottomSheet(
context: context,
builder: (BuildContext builder) {
return Container(
height: MediaQuery.of(context).copyWith().size.height / 2,
child: CupertinoTimerPicker(
onTimerDurationChanged: (Duration newDuration) {
setState(() {
widget.passedValue = newDuration;
});
},
minuteInterval: 1,
secondInterval: 5,
mode: CupertinoTimerPickerMode.ms,
),
);
},
);
}
String _formatDuration(Duration duration) {
String twoDigits(int n) => n.toString().padLeft(2, "0");
String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
return "$twoDigitMinutes:$twoDigitSeconds";
}
}

最好的方法是使用回调,将值返回给它的父值,对于这种情况,您可以使用valuechange。然后在父元素被激活后再修改变量的值。

class SetTimerPage extends StatefulWidget {
@override
_SetTimerPageState createState() => _SetTimerPageState();
}
class _SetTimerPageState extends State<SetTimerPage> {
Duration countdown;
@override
void initState() {
super.initState();
countdown = Duration(minutes: 0, seconds: 0);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('RoundONE'),
),
body: Container(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
CustomRowWidget(
icon: Icons.alarm_sharp,
text: 'COUNTDOWN',
button: CupertinoTimePickerButton(
passedValue: countdown,
onChanged: (Duration duration) {
setState(() {
this.countdown = duration;
});
},
),
),
StartButton(countdown: countdown),
],
),
),
);
}
}
class CupertinoTimePickerButton extends StatelessWidget {
final Duration passedValue;
final ValueChanged<Duration> onChanged;
@override
Widget build(BuildContext context) {
return MaterialButton(
child: Text(
_formatDuration(widget.passedValue),
style: TextStyle(color: Colors.white),
),
color: Colors.redAccent,
onPressed: () {
_cupertinoTimeSetter(context);
},
);
}
Future _cupertinoTimeSetter(BuildContext context) {
return showModalBottomSheet(
context: context,
builder: (BuildContext builder) {
return Container(
height: MediaQuery.of(context).copyWith().size.height / 2,
child: CupertinoTimerPicker(
onTimerDurationChanged: this.onChanged,
minuteInterval: 1,
secondInterval: 5,
mode: CupertinoTimerPickerMode.ms,
),
);
},
);
}
String _formatDuration(Duration duration) {
String twoDigits(int n) => n.toString().padLeft(2, "0");
String twoDigitMinutes = twoDigits(duration.inMinutes.remainder(60));
String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60));
return "$twoDigitMinutes:$twoDigitSeconds";
}
}

最新更新