Flutter 中的下拉按钮用法 - 未处理的异常:类型“double”不是类型“int”的子类型;的“价值”

发布于 2025-01-15 11:24:07 字数 6235 浏览 1 评论 0原文

我正在尝试使用下拉按钮来更改某些值,然后使用这些值来更改对象属性并调用对象方法,但当我尝试这样做时,我收到以下错误,

num glute_mev = 2;
num glute_mv = 2;
num glute_mrv_2x = 12;
num glute_mrv_3x = 18;
num glute_mrv_4x = 25;

class Mesocycle {

  late num duration;
  late String mode;
  late num freq;

// would prefer to not initialize but it gives an error if i dont
  late num gluteFreq;
  late String gluteMode = 'MAX'; 
  late num gluteIncrement = 1.0;

  List gluteExercises = <String>[];
  List gluteVolume = <int>[];

  generateGluteVolume() {
    //4 week mesocycle
    if (duration == 4 && gluteMode != 'off') {
      gluteVolume.add(glute_mev);
      gluteVolume.add(glute_mev + gluteIncrement * 2);
      gluteVolume.add(glute_mev + gluteIncrement * 3);
      gluteVolume.add(glute_mev + (gluteIncrement * 3) / 3); //deload
    }
    //8 week mesocycle
    if (duration == 8 && gluteMode != 'off') {
      gluteVolume.add(glute_mev);
      gluteVolume.add(glute_mev + gluteIncrement * 2);
      gluteVolume.add(glute_mev + gluteIncrement * 3);
      gluteVolume.add(glute_mev + gluteIncrement * 4);
      gluteVolume.add(glute_mev + gluteIncrement * 5);
      gluteVolume.add(glute_mev + gluteIncrement * 6);
      gluteVolume.add(glute_mev + gluteIncrement * 7);
      gluteVolume.add(glute_mev + (gluteIncrement * 7) / 3); //deload
    }
  }

  set_Freq(String group, num _freq) {
    if (group == 'glutes') {
      gluteFreq = _freq;
    }
  }

  set_Mode(String group, String _mode) {
    if (group == 'glutes') {
      gluteMode = _mode;
    }
  }

  set_gluteIncrement() {
    if (gluteFreq == 2) {
      gluteIncrement = (glute_mrv_2x - glute_mev) / (duration - 1);
    }
    if (gluteFreq == 3) {
      gluteIncrement = (glute_mrv_3x - glute_mev) / (duration - 1);
    }
    if (gluteFreq == 4) {
      gluteIncrement = (glute_mrv_4x - glute_mev) / (duration - 1);
    }
  }

  Mesocycle({
    required this.duration,
    required this.freq,
    required this.mode,
  });
}

void main() {
  runApp(MaterialApp(home: MesocycleView()));
}
// #endregion

class MesocycleView extends StatefulWidget {
  const MesocycleView({Key? key}) : super(key: key);

  @override
  State<MesocycleView> createState() => _MesocycleViewState();
}

class _MesocycleViewState extends State<MesocycleView> {
  late String _gluteMode = 'MAX';
  var _gluteFreq;
  var _fontSize = 20.0;

  
  List<String> frequency = ['1', '2', '3', '4'];


  Mesocycle Meso1 = Mesocycle(
    duration: 8,
    freq: 2,
    mode: 'mass',
  );
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.grey,
        appBar: AppBar(
          title: Text('Mesocycle View'),
          centerTitle: true,
          backgroundColor: Colors.amber,
        ),
        // #region Grid
        body: Center(
          child: Container(
            //margin: EdgeInsets.fromLTRB(100.0, 10.0, 10.0, 10.0),
            child: GridView(
              children: [
                
                Container(
                    child: DropdownButton(
                  hint: _gluteMode == null
                      ? Center(child: Text('Mode'))
                      : Center(
                          child: Text(
                            _gluteMode,
                            style: TextStyle(
                                color: Colors.black, fontSize: _fontSize),
                          ),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(color: Colors.black, fontSize: _fontSize),
                  items: ['Max', 'Min', 'Maintain', 'Off'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _gluteMode = val.toString();
                        Meso1.set_Mode('glutes', _gluteMode);
                        Meso1.generateGluteVolume();
                      },
                    );
                  },
                )),
                Container(
                    child: DropdownButton(
                  hint: _gluteFreq == null
                      ? Center(child: Text('Freq.'))
                      : Center(
                          child: Text(
                            _gluteFreq,
                            style: TextStyle(
                              color: Colors.black,
                              fontSize: _fontSize,
                            ),
                          ),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(color: Colors.black, fontSize: _fontSize),
                  items: ['2', '3', '4'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _gluteFreq = val;
                        Meso1.set_Freq('glutes', _gluteFreq);
                        Meso1.generateGluteVolume();
                      },
                    );
                  },
                )),
... etc

E/flutter (11519): [ERROR:flutter /lib/ui/ui_dart_state.cc(209)] 未处理的异常:“double”类型不是“value”

E/flutter 的“int”类型的子类型(11519): #0 List.add (dart:core-patch/growable_array.dart)

E/flutter (11519): #1 Mesocycle.generateGoluteVolume

E/flutter (11519): #2 _MesocycleViewState.build..

E/flutter (11519): # 3 State.setState

E/flutter (11519): #4 _MesocycleViewState.build。

E/flutter (11519): #5 _DropdownButtonState._handleTap。

E/flutter (11519): #6 _rootRunUnary (dart:async/zone.dart:1434:47)

E/flutter (11519): #7 _CustomZone.runUnary (dart:async/zone.dart:1335:19)

E/ flutter (11519):异步暂停

I'm trying to use a dropdown button to change some values and then using those values to change object properties and call object methods but im getting the following errors when i attempt to do so,

num glute_mev = 2;
num glute_mv = 2;
num glute_mrv_2x = 12;
num glute_mrv_3x = 18;
num glute_mrv_4x = 25;

class Mesocycle {

  late num duration;
  late String mode;
  late num freq;

// would prefer to not initialize but it gives an error if i dont
  late num gluteFreq;
  late String gluteMode = 'MAX'; 
  late num gluteIncrement = 1.0;

  List gluteExercises = <String>[];
  List gluteVolume = <int>[];

  generateGluteVolume() {
    //4 week mesocycle
    if (duration == 4 && gluteMode != 'off') {
      gluteVolume.add(glute_mev);
      gluteVolume.add(glute_mev + gluteIncrement * 2);
      gluteVolume.add(glute_mev + gluteIncrement * 3);
      gluteVolume.add(glute_mev + (gluteIncrement * 3) / 3); //deload
    }
    //8 week mesocycle
    if (duration == 8 && gluteMode != 'off') {
      gluteVolume.add(glute_mev);
      gluteVolume.add(glute_mev + gluteIncrement * 2);
      gluteVolume.add(glute_mev + gluteIncrement * 3);
      gluteVolume.add(glute_mev + gluteIncrement * 4);
      gluteVolume.add(glute_mev + gluteIncrement * 5);
      gluteVolume.add(glute_mev + gluteIncrement * 6);
      gluteVolume.add(glute_mev + gluteIncrement * 7);
      gluteVolume.add(glute_mev + (gluteIncrement * 7) / 3); //deload
    }
  }

  set_Freq(String group, num _freq) {
    if (group == 'glutes') {
      gluteFreq = _freq;
    }
  }

  set_Mode(String group, String _mode) {
    if (group == 'glutes') {
      gluteMode = _mode;
    }
  }

  set_gluteIncrement() {
    if (gluteFreq == 2) {
      gluteIncrement = (glute_mrv_2x - glute_mev) / (duration - 1);
    }
    if (gluteFreq == 3) {
      gluteIncrement = (glute_mrv_3x - glute_mev) / (duration - 1);
    }
    if (gluteFreq == 4) {
      gluteIncrement = (glute_mrv_4x - glute_mev) / (duration - 1);
    }
  }

  Mesocycle({
    required this.duration,
    required this.freq,
    required this.mode,
  });
}

void main() {
  runApp(MaterialApp(home: MesocycleView()));
}
// #endregion

class MesocycleView extends StatefulWidget {
  const MesocycleView({Key? key}) : super(key: key);

  @override
  State<MesocycleView> createState() => _MesocycleViewState();
}

class _MesocycleViewState extends State<MesocycleView> {
  late String _gluteMode = 'MAX';
  var _gluteFreq;
  var _fontSize = 20.0;

  
  List<String> frequency = ['1', '2', '3', '4'];


  Mesocycle Meso1 = Mesocycle(
    duration: 8,
    freq: 2,
    mode: 'mass',
  );
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.grey,
        appBar: AppBar(
          title: Text('Mesocycle View'),
          centerTitle: true,
          backgroundColor: Colors.amber,
        ),
        // #region Grid
        body: Center(
          child: Container(
            //margin: EdgeInsets.fromLTRB(100.0, 10.0, 10.0, 10.0),
            child: GridView(
              children: [
                
                Container(
                    child: DropdownButton(
                  hint: _gluteMode == null
                      ? Center(child: Text('Mode'))
                      : Center(
                          child: Text(
                            _gluteMode,
                            style: TextStyle(
                                color: Colors.black, fontSize: _fontSize),
                          ),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(color: Colors.black, fontSize: _fontSize),
                  items: ['Max', 'Min', 'Maintain', 'Off'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _gluteMode = val.toString();
                        Meso1.set_Mode('glutes', _gluteMode);
                        Meso1.generateGluteVolume();
                      },
                    );
                  },
                )),
                Container(
                    child: DropdownButton(
                  hint: _gluteFreq == null
                      ? Center(child: Text('Freq.'))
                      : Center(
                          child: Text(
                            _gluteFreq,
                            style: TextStyle(
                              color: Colors.black,
                              fontSize: _fontSize,
                            ),
                          ),
                        ),
                  isExpanded: true,
                  iconSize: 30.0,
                  style: TextStyle(color: Colors.black, fontSize: _fontSize),
                  items: ['2', '3', '4'].map(
                    (val) {
                      return DropdownMenuItem<String>(
                        value: val,
                        child: Text(val),
                      );
                    },
                  ).toList(),
                  onChanged: (val) {
                    setState(
                      () {
                        _gluteFreq = val;
                        Meso1.set_Freq('glutes', _gluteFreq);
                        Meso1.generateGluteVolume();
                      },
                    );
                  },
                )),
... etc

E/flutter (11519): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type 'double' is not a subtype of type 'int' of 'value'

E/flutter (11519): #0 List.add (dart:core-patch/growable_array.dart)

E/flutter (11519): #1 Mesocycle.generateGluteVolume

E/flutter (11519): #2 _MesocycleViewState.build..

E/flutter (11519): #3 State.setState

E/flutter (11519): #4 _MesocycleViewState.build.

E/flutter (11519): #5 _DropdownButtonState._handleTap.

E/flutter (11519): #6 _rootRunUnary (dart:async/zone.dart:1434:47)

E/flutter (11519): #7 _CustomZone.runUnary (dart:async/zone.dart:1335:19)

E/flutter (11519): asynchronous suspension

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傻比既视感 2025-01-22 11:24:07

Mesocycle 类中,您将 glueVolume 列表初始化为 []。但是,稍后您尝试执行此操作:

gluteVolume.add(glute_mev + (gluteIncrement * 3) / 3);

基于 Dart文档中,/运算符(除法)的结果类型是double。因此,您尝试将 double 类型值添加到 int 列表中 - 您会收到错误。

解决问题的最简单方法是将 glueVolume 列表启动为 []

final gluteVolume = <double>[];

如果您想保留 glueVolume列表为 [],您可以使用截断除法 (~/),其中小数结果通过向零舍入而转换为整数:

gluteVolume.add(glute_mev + (gluteIncrement * 3) ~/ 3);

或者您可以使用round()/floor() 函数(基于您期望的结果):

gluteVolume.add((glute_mev + (gluteIncrement * 3) / 3).round());
// OR
gluteVolume.add((glute_mev + (gluteIncrement * 3) / 3).round());

Inside the Mesocycle class, you initialise the gluteVolume list as <int>[]. However, later you try to execute this:

gluteVolume.add(glute_mev + (gluteIncrement * 3) / 3);

Based on the Dart documentation, the result type of / operator (division) is double. Thus, you are trying to add a double type value to an int list - you get the error.

The easiest way to resolve an issue is to initiate the gluteVolume list as <double>[]:

final gluteVolume = <double>[];

If you would like to keep your gluteVolume list as <int>[], you can use the truncating division (~/) where a fractional result is converted to an integer by rounding towards zero:

gluteVolume.add(glute_mev + (gluteIncrement * 3) ~/ 3);

Or you could use the round()/floor() functions (based on the result you expect):

gluteVolume.add((glute_mev + (gluteIncrement * 3) / 3).round());
// OR
gluteVolume.add((glute_mev + (gluteIncrement * 3) / 3).round());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文