【问题标题】:Why am i having problem with my toggle button为什么我的切换按钮有问题
【发布时间】:2022-01-21 06:18:52
【问题描述】:

大家好,我是 Flutter 的新手,所以我试图构建一个 BMI 计算器,所以我试图在“MALE”和“FEMALE”之间创建一个切换开关,这样当点击一张卡片时,另一张卡片就会变为非活动状态我正在尝试使用三元代码来实现这一目标

但问题是如果我在我的模拟器上运行应用程序并且如果我点击“MALE”部分它不会被选中但如果我点击“FEMALE”部分“MALE”卡会被选中并且“除非我重新加载应用程序,否则女性卡仍处于非活动状态,而“男性”卡仍处于活动状态,但这并不能解决问题。

如果有人可以告诉我如何修复该错误,请告诉我。我会为此感到高兴

 enum Gender {
  male,
  female,
  empty,
}
class ReuseableCard extends StatelessWidget {
  ReuseableCard({required this.colour, this.cardChild, this.onPress});
  final Color colour;
  final Widget? cardChild;
  final VoidCallback? onPress;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: onPress,
      child: Container(
          child: cardChild,
          margin: EdgeInsets.all(15),
          decoration: BoxDecoration(
              color: colour, borderRadius: BorderRadius.circular(15))),
    );
  }
}

class _InputPageState extends State<InputPage> {
  Gender selectedGender = Gender.empty;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Center(child: Text('BMI CALCULATOR')),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          Expanded(
              child: Row(
            children: [
              Expanded(
                child: ReuseableCard(
                  cardChild: cardTitle(
                    fontIcon: FontAwesomeIcons.mars,
                    cardText: 'MALE',
                  ),
               //I DONT KNOW IF I AM WRONG HERE
                  colour: selectedGender == Gender.male
                      ? activeCardColor
                      : inactiveCardColor,
                ),
              ),
              Expanded(
                child: ReuseableCard(
                  onPress: () {
                    setState(() {
                      selectedGender = Gender.male;
                    });
                  },
                  cardChild: cardTitle(
                    fontIcon: FontAwesomeIcons.venus,
                    cardText: 'FEMALE',
                  ),
                  //I DONT KNOW IF I AM WRONG HERE
                  colour: selectedGender == Gender.female
                      ? activeCardColor
                      : inactiveCardColor,
                ),
              )
            ],
          )),
          Expanded(
            child: ReuseableCard(
              onPress: () {
                selectedGender = Gender.female;
              },
              colour: activeCardColor,
              cardChild: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Text(
                    'HEIGHT',
                    style: labelTextStyle,
                  ),
                  Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.baseline,
                    textBaseline: TextBaseline.alphabetic,
                    children: [
                      Text(
                        height.toString(),
                        style: numberStyle,
                      ),
                      Text('cm'),
                    ],
                  ),
                  SliderTheme(
                    data: SliderTheme.of(context).copyWith(
                        inactiveTrackColor: Color(0xFF8D8E98),
                        thumbColor: Color(0xFFEB1555),
                        overlayColor: Color(0x29EB1555),
                        activeTrackColor: Colors.white,
                        thumbShape:
                            RoundSliderThumbShape(enabledThumbRadius: 20.0),
                        overlayShape:
                            RoundSliderOverlayShape(overlayRadius: 30.0)),
                    child: Slider(
                      value: height.toDouble(),
                      min: 120.0,
                      max: 220.0,
                      onChanged: (double newValue) {
                        setState(() {
                          height = newValue.round();
                        });
                      },
                    ),
                  ),
            ],

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    我可以看到你的男性盒子没有方法onPress所以它不会做任何事情你的女性盒子onPress将值设置为male这样点击女性盒子会让男性活跃并且什么都不做女性盒子,出于某种原因,您的 height 盒子将值设置为 female

    您需要将onPress 方法上移一级⬆️

    母盒上的移到->公盒

    高度框将其移至 -> 女性框

    这应该可以解决问题。

    【讨论】:

    • 你能看看我上传的第二张截图吗@to-be 它仍然没有同时改变
    • 为什么在单击男性框时将selectedGender的值设置为女性,而另一个相同?
    • 你能再看一下女性按下时的代码吗?现在值设置为selectedGender=Gender.male,而男性框SelectedGender=Gender.male不是?在按下功能中,但它仍然没有同时改变?请问我哪里出错了?我又重新上传了图片
    • 公卡应将selectedGender设置为Gender.male,母卡应将selectedGender设置为Gender.female。请务必在setState(() {...}) 中设置值。
    【解决方案2】:

    你贴的截图中的Yemi对女卡进行了以下更改...

    // from this
    onPress: (){
    selectedGender = Gender.male;
    }
    
    // to this
    onPress: (){
    setState((){
    selectedGender = Gender.female;
    });
    }
    

    我建议您花点时间重新观看您正在观看的教程中的模块 - 我假设您正在学习 Angela yu 的课程。另外,如果您感到压力很大,请休息一下,稍后再回来

    【讨论】:

    • 在我按照您的建议更改了代码后,我注意到了一些关于此的事情,在我热启动应用程序后,如果我点击“MALE”框,它就会被选中。但是如果我点击“女性”框,除非我调整滑块,否则它不会立即被选中,这正常吗?
    【解决方案3】:

    在男性onPress

    中添加这一行
    setState((){
        selectedGender = Gender.male;
    })
    

    并将这一行添加到 famele onPress

    setState((){
       selectedGender = Gender.female;
    })
    

    它将解决您的问题。

    【讨论】:

    • 谢谢,我刚刚看到我的错误,现在可以正常工作了
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多