我的男性和女性切换按钮在 bmi 计算器中不起作用

My male and female toggle button is not working in bmi calculator

自从我将 Gesturedetector widgit 移动到 reusable_child.dart 文件后,我的应用程序就无法正常运行了。求高人帮我解决一下男女切换的问题

以前,当整个代码都在一个文件中时(即 BODY.dart)它工作正常,这个问题是在我为每个文件创建单独的 dart 文件后出现的

BODY.dart

import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'reusable_card.dart';
import 'reusable_child.dart';
import 'AppDrawer.dart';

const double bottomContainerHeight = 80.0;
const Color containerColours = Color(0xFF1D1E33);
const Color inactiveContainerColor = Color(0xFF111328);

enum GenderType {
  MALE,
  FEMALE,
}

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

  @override
  _BODYState createState() => _BODYState();
}

class _BODYState extends State<BODY> {
  GenderType selectedGender = GenderType.MALE;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: AppDrawer(),
      appBar: AppBar(
          title: Padding(
          padding: const EdgeInsets.all(50.0),
          child: Text('BMI Calculator'),
        ),
      ),
      body: Column(
        children: [
          Expanded(
            child: Row(
              children: [
                Expanded(
                  child: ReusableCard(
                    colour: selectedGender == GenderType.MALE
                        ? containerColours
                        : inactiveContainerColor,
                    cardChild: ReusableChild(
                      containerIcon: FontAwesomeIcons.mars,
                      txt: 'MALE',
                    ),
                    onPress: () {
                      setState(() {
                        selectedGender = GenderType.MALE;
                      });
                    },
                  ),
                ),
                Expanded(
                  child: ReusableCard(
                    cardChild: ReusableChild(
                      containerIcon: FontAwesomeIcons.venus,
                      txt: 'FEMALE',
                    ),
                    colour: selectedGender == GenderType.FEMALE
                        ? containerColours
                        : inactiveContainerColor,
                    onPress: () {
                      selectedGender = GenderType.FEMALE;
                    },
                  ),
                )
              ],
            ),
          ),
          Expanded(
            child: ReusableCard(
              onPress: () {},
              colour: containerColours,
            ),
          ),
          Expanded(
            child: Row(
              children: [
                Expanded(
                  child: ReusableCard(
                    onPress: () {},
                    colour: containerColours,
                  ),
                ),
                Expanded(
                  child: ReusableCard(
                    onPress: () {},
                    colour: containerColours,
                  ),
                ),
              ],
            ),
          ),
          Container(
            color: Colors.pink.shade400,
            width: double.infinity,
            height: bottomContainerHeight,
            margin: EdgeInsets.only(top: 10.0),
            child: Padding(
              padding: const EdgeInsets.all(17.0),
              child: Text(
                'Calculate',
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 30,
                  fontWeight: FontWeight.bold,
                ),
              ),
            ),
          )
        ],
      ),
    );
  }
}

resuable_card.dart

import 'package:flutter/material.dart';

class ReusableCard extends StatelessWidget {
  ReusableCard({
    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.0),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(8.0),
          color: colour,
        ),
      ),
    );
  }
}

resuable_child.dart

import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';

class ReusableChild extends StatelessWidget {
  final containerIcon;
  final String txt;
  ReusableChild({this.containerIcon = FontAwesomeIcons.amazon, this.txt = ''});
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Icon(
          containerIcon,
          color: Color(0xFFffffff),
          size: 80.0,
        ),
        SizedBox(
          height: 10,
        ),
        Text(
          txt,
          style: TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: 18.0,
            color: Colors.grey.shade500,
          ),
        )
      ],
    );
  }
}

问题出在您的 FEMALE ReusableCard 的 onPress

onPress: () {
  selectedGender = GenderType.FEMALE;
},

你也忘了在这里加上setState

onPress: () {
  setState(() {
    selectedGender = GenderType.FEMALE;
  });
},