微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将一个类中的变量提供给另一个类并将更改后的变量返回?

如何解决如何将一个类中的变量提供给另一个类并将更改后的变量返回?

我是新手,我正在尝试从 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";
  }
}

解决方法

最好的方法是使用回调将值返回给它的父级,在这种情况下,您可以使用 ValueChanged。然后在父之后会负责更改变量值。

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";
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?