如何修复错误“每个 child 必须恰好布置一次。”在颤抖中
How to fix the error, " Each child must be laid out exactly once." in flutter
卡的颜色改变了一次,但随后错误一直出现在调试控制台中,并且与应用程序的连接丢失。
它说相关的 error-causing 小部件是脚手架。这个错误也在终端
断言失败:第 4978 行第 16 行:'child is! ParentDataElement<ParentData>':不正确。
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)
],
);
}
}
我已经尝试了我所知道的一切,但似乎无法解决问题。
这里是问题的解决方案,有一个 Expanded 是其他 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,
)
],
),
);
}
卡的颜色改变了一次,但随后错误一直出现在调试控制台中,并且与应用程序的连接丢失。
它说相关的 error-causing 小部件是脚手架。这个错误也在终端
断言失败:第 4978 行第 16 行:'child is! ParentDataElement<ParentData>':不正确。
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)
],
);
}
}
我已经尝试了我所知道的一切,但似乎无法解决问题。
这里是问题的解决方案,有一个 Expanded 是其他 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,
)
],
),
);
}