The color of the card changes once but then the error keeps appearing in the debug console and the connection to the app is lost.
It says that the relevant error-causing widget is scaffold. This error was also in the terminal
Failed assertion: line 4978 pos 16: 'child is! ParentDataElement<ParentData>': is not true.
main.dart
import 'package:flutter/material.dart';
import 'input_page.dart';
void main() => runApp(BMICalculator());
class BMICalculator extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: Color(0xFF090C22),
colorScheme: ColorScheme.fromSwatch().copyWith(
primary: Color(0xFF090C22),
),
),
home: InputPage(),
);
}
}
input_page.dart
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'icon_content.dart';
import 'reusable_card.dart';
const bottomContainerHeight = 80.0;
const activeCardColor = Color(0xFF1D1E33);
const inactiveCardColor = Color(0xFF111328);
const bottomContainerColor = Color(0xFFEB1555);
class InputPage extends StatefulWidget {
@override
_InputPageState createState() => _InputPageState();
}
class _InputPageState extends State<InputPage> {
Color maleCardColor = inactiveCardColor;
Color femaleCardColor = inactiveCardColor;
void updateColor(int gender) {
if (gender == 1) {
if (maleCardColor == inactiveCardColor) {
maleCardColor = activeCardColor;
} else {
maleCardColor = inactiveCardColor;
}
}
if (gender == 2) {
if (femaleCardColor == inactiveCardColor) {
femaleCardColor = activeCardColor;
} else {
femaleCardColor = inactiveCardColor;
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('BMI CALCULATOR'),
centerTitle: true,
),
body: Column(
children: [
Expanded(
child: Row(
children: [
Expanded(
child: GestureDetector(
onTap: () {
setState(() {
print('Male');
updateColor(1);
});
},
child: ReusableCard(
colour: maleCardColor,
cardChild: IconContent(
label: 'MALE',
cardIcon: FontAwesomeIcons.mars,
),
),
),
),
Expanded(
child: GestureDetector(
onTap: () {
setState(() {
print('Female');
updateColor(2);
});
},
child: ReusableCard(
colour: femaleCardColor,
cardChild: IconContent(
label: 'FEMALE',
cardIcon: FontAwesomeIcons.venus,
),
),
),
),
],
),
),
Expanded(
child: Expanded(
child: ReusableCard(
colour: activeCardColor,
),
),
),
Expanded(
child: Row(
children: [
Expanded(
child: ReusableCard(
colour: activeCardColor,
),
),
Expanded(
child: ReusableCard(
colour: activeCardColor,
),
),
],
),
),
Container(
color: bottomContainerColor,
margin: EdgeInsets.only(top: 10.0),
width: double.infinity,
height: bottomContainerHeight,
)
],
),
);
}
}
reusable_card.dart
import 'package:flutter/material.dart';
class ReusableCard extends StatelessWidget {
ReusableCard({@required this.colour, this.cardChild});
final Color colour;
final Widget cardChild;
@override
Widget build(BuildContext context) {
return Container(
child: cardChild,
margin: EdgeInsets.all(15.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: colour,
),
);
}
}
icon_content.dart
import 'package:flutter/material.dart';
const labelTextStyle = TextStyle(
fontSize: 18.0,
color: Color(0xFF8D8E98),
);
class IconContent extends StatelessWidget {
IconContent({this.cardIcon, this.label});
final IconData cardIcon;
final String label;
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(cardIcon, size: 80.0),
SizedBox(
height: 15.0,
),
Text(label, style: labelTextStyle)
],
);
}
}
I've tried everything I know but can't seem to fix the problem.
CodePudding user response:
Here the solution for the problem, there is a Expanded that is a child of other Expanded:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('BMI CALCULATOR'),
centerTitle: true,
),
body: Column(
children: [
Expanded(
child: Row(
children: [
Expanded(
child: GestureDetector(
onTap: () {
setState(() {
print('Male');
updateColor(1);
});
},
child: ReusableCard(
colour: maleCardColor,
cardChild: IconContent(
label: 'MALE',
cardIcon: FontAwesomeIcons.mars,
),
),
),
),
Expanded(
child: GestureDetector(
onTap: () {
setState(() {
print('Female');
updateColor(2);
});
},
child: ReusableCard(
colour: femaleCardColor,
cardChild: IconContent(
label: 'FEMALE',
cardIcon: FontAwesomeIcons.venus,
),
),
),
),
],
),
),
Expanded( // <----- just remove the Expanded that was a parent of this one
child: ReusableCard(
colour: activeCardColor,
),
),
Expanded(
child: Row(
children: [
Expanded(
child: ReusableCard(
colour: activeCardColor,
),
),
Expanded(
child: ReusableCard(
colour: activeCardColor,
),
),
],
),
),
Container(
color: bottomContainerColor,
margin: EdgeInsets.only(top: 10.0),
width: double.infinity,
height: bottomContainerHeight,
)
],
),
);
}