Flutter错误:每个孩子必须准确地布置一次。关于建筑布局

时间:2020-02-05 13:29:52

标签: android flutter flutter-layout flutter-bloc

我开始努力应对。看起来很不错而且很容易,但是涉及到错误时没有太多资源。无论如何,经过长时间的思考,检查和即兴创作,我开始在网上搜索答案,好吧,那是没有的。因此,我想问大家,也许有人可以向我解释为什么我会收到该错误,这是什么意思,以及如何消除它。

哦,在深入之前,我可能应该提到我正在使用flutter_bloc。

好,所以我有这样的代码:

class Settings extends StatelessWidget {
  final _formKey = GlobalKey<FormState>();
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
          title: new Text("SomeApp",style: TextStyle(color: Colors.white)),
          automaticallyImplyLeading: false,
          backgroundColor: myBlue.shade50,

          actions: <Widget>[
            IconButton(
              icon: new Icon(FontAwesomeIcons.download,color:  Colors.white),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => DownloadView()),
                );
              },
            ),
            IconButton(
              icon: new Icon(FontAwesomeIcons.chevronCircleLeft,color:  Colors.white),
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => MainWindow()),
                );
              },
            ),]
      ),
      body: Container(
        padding: EdgeInsets.symmetric(vertical: 16),
        alignment: Alignment.center,
        child: new BlocBuilder<SettingsBloc, SettingsState>(
          builder: (context, state) {
            if (state is SettingsNotLoaded) {
              return new Center(
                  child: Text(
                    'count1',
                    style: TextStyle(fontSize: 24.0,color: Colors.black),
                  )
              );
            } else if (state is SettingsLoaded) {  
              return new Center(
                  child: Text(
                    'count2',
                    style: TextStyle(fontSize: 24.0,color: Colors.black),
                  )
              );
            }
            else
              {
                return new Center(
                    child: Text(
                      'count3',
                      style: TextStyle(fontSize: 24.0,color: Colors.black),
                    )
                );
              }
          },
        ),

      ),
    );
  }

当启动我的应用程序时,我会按照自己的方式看到appBar,但是在正文中看不到任何文本(我应该看到count1,count2或count3),但是却收到错误消息:“每个孩子都必须只能布置一次。”参考第5-return new Scaffold(行。 说真的,这使我发疯。有人知道吗?

在此先感谢大家的问候!

PS。当然,您也可以在flutter_bloc页面上的https://flutter.dev/docs/development/ui/layout/tutorial上以及在Google中搜索信息。

编辑1 一些语法错误 编辑2 添加了修改信息

13 个答案:

答案 0 :(得分:26)

您好,我遇到了同样的问题,我认为这只是flutter.Bug中的一个错误,请停止然后重新安装您的应用

答案 1 :(得分:8)

这不是扑朔迷离的错误,尽管上面的解决方案是正确的,但有时似乎失败了,我也遇到过同样的问题。

尝试以下命令

flutter clean

然后再次运行

flutter run

或者,如果您使用的是Android Studio(已启用Flutter插件)

转到工具> Flutter> Flutter Clean

然后再次运行该应用程序, 与上述命令相同

编辑: 在熟悉Flutter大约一个星期之后,现在我确实了解到,对代码进行更改(例如在pubspec.yaml中添加新的依赖项)需要停止应用程序并再次运行,我确实注意到IDE中的GUI(我使用Android Studio)可能会出现问题,命令行中的上述命令可以正常工作。

快乐编码:)

答案 2 :(得分:7)

最近我有同样的错误。

在我的情况下,该错误是由于彼此嵌套两个 Expanded Widgets 而引起的。

通过删除父级扩展小部件,错误已消失。

答案 3 :(得分:3)

尝试以下操作:

  1. 停止模拟。
  2. 转到Android虚拟设备管理器。
  3. 转到虚拟设备中的“操作”。
  4. 单击向下箭头以查看选项。
  5. 点击“清除数据”
  6. 再次运行模拟。

它与我一起用于Android设备。

答案 4 :(得分:2)

当我执行热重载时,我遇到了同样的问题,然后执行了热重启动,然后它消失了。看起来像是Flutter错误。

答案 5 :(得分:2)

如何修复

flutter clean

对我来说很好,尽管可以复制

是什么触发了我的情况

自从我在应用程序中实现Streams以来,这一切就开始了。

我假设通过使用StreamController并更改曾经侦听该流的内容,会在运行时产生错误,并与我返回到{{1 }}。

再现错误的代码:

StreamBuilder

例如:

  1. 将某些代码更改为已打开的(例如:流输入验证器)
  2. 保存应用程序(假设模拟器已打开)
  3. 再现错误

答案 6 :(得分:0)

我最近遇到了这个问题,我发现使用热重装次数仅推动设计中的修改或任何存储的sqlite数据。

  1. 因此,在我的情况下,从应用程序中删除存储的数据。 (清除所有缓存)和
  2. 运行扑通干净

答案 7 :(得分:0)

我面临着同样的问题。我做了以下事情,

  1. 从设备上卸载应用程序
  2. 干净整洁
  3. 颤动

希望这行得通。

答案 8 :(得分:0)

尝试:

  1. 停止程序
  2. adb卸载“ $ yourPackageName”
  3. 干净整洁
  4. 再次运行程序

您可以在“ android / app / build.gradle” => defaultConfig / applicationId

中找到包的名称。

Obs:还请记住,只有在解决了导致此错误的问题的情况下,这才起作用。

这对我有用。

答案 9 :(得分:0)

对于任何在iOS模拟器中遇到此错误的人,卸载并重新安装该应用程序对我来说都是有效的。当我们过多使用热重装时,就会发生这种情况。

我的Flutter版本:Flutter (Channel master, 1.22.0-2.0.pre.66, on Mac OS X 10.15.3 19D76, locale en-LK),并且我正在使用android studio构建

答案 10 :(得分:0)

import 'package:flutter/material.dart';

import 'package:font_awesome_flutter/font_awesome_flutter.dart';

void main()=> runApp(BMIcalculatro());

class BMIcalculatro extends StatelessWidget {

@override

Widget build(BuildContext context) {

return MaterialApp(



  theme: ThemeData.dark().copyWith(

    primaryColor: Color(0xFF0A0E21),


    scaffoldBackgroundColor: Color(0xFF0A0E21),

  ),

  home: InputPage(),

) ;

} }



const activColor = Color(0xFF1D1E33);



const inActiveColor = Color(0XFF111328);



enum Gender{




male, female



}



class InputPage extends StatefulWidget {




@override



_InputPageState createState() => _InputPageState();



}



class _InputPageState extends State {



Gender genderSelected;



@override



Widget build(BuildContext context) {




return Scaffold(



    appBar: AppBar(



      title: Text('BMIcalculator'),



      centerTitle: true,



    ),

    body: Column(



      children: [



        Expanded(




          child: Row(



            children: [



              Expanded(




                child: GestureDetector(



                  onTap: () {



                    setState(() {



                      genderSelected=Gender.male;



                    });




                  },



                  child: ReusableCard(





                    colour: genderSelected ==Gender.male ? activColor: inActiveColor,



                    cardChaild: IconrContakt(



                      icone: FontAwesomeIcons.mars,



                      name: "MAIL",



                    ),


                  ),

                ),

              ),

              Expanded(



                child: GestureDetector(



                  onTap: () {




                    setState(() {



                       genderSelected=Gender.female;



                    });

                  },

                  child: ReusableCard(



                    colour: genderSelected==Gender.female ? activColor:inActiveColor,



                    cardChaild: IconrContakt(




                      icone: FontAwesomeIcons.venus,



                      name: "female",

                    ),

                  ),


                ),


              ),

            ],

          ),

        ),

        Expanded(



          child: Expanded(



            child: ReusableCard(



              colour: activColor,


            ),
          ),

        ),
        Expanded(



          child: Row(



            children: [



              Expanded(



                  child: ReusableCard(



                colour: activColor,



              )),

              Expanded(



                child: ReusableCard(



                  colour: activColor,



                ),

              ),

            ],

          ),

        ),

        Container(



          margin: EdgeInsets.only(top: 12),



          decoration: BoxDecoration(



            color: Color(0xFFEB1555),



          ),

          child: Center(



              child: Text(



            'BMI CALCULATOR',



            style: TextStyle(color: Colors.white, fontSize: 20),



          )),

          width: double.infinity,



          height: 80.0,



        )

      ],

    ),

    );

} }



class IconrContakt extends StatelessWidget {



IconrContakt({this.icone, this.name});



final IconData icone;



final String name;



@override



Widget build(BuildContext context) {



return Column(



  mainAxisAlignment: MainAxisAlignment.center,



  children: [



    Icon(



      icone,



      size: 80,



    ),

    SizedBox(



      height: 15,



    ),

    Text(



      name,



      style: TextStyle(fontSize: 18.0),



    )

  ],

);

} }



class ReusableCard extends StatelessWidget {



ReusableCard({@required this.colour, this.cardChaild});



final Color colour;



final Widget cardChaild;



@override



Widget build(BuildContext context) {



return Container(



  child: cardChaild,



  margin: EdgeInsets.all(12.0),



  decoration: BoxDecoration(



    color: colour,



    borderRadius: BorderRadius.circular(10.3),



  ),

);

} }

这里是错误

<块引用>

======== 小部件库捕获的异常=============================== =

'package:flutter/src/widgets/framework.dart':断言失败:第 5022 行 pos 16:>'child

是!'

ParentDataElement':不是真的。'

相关的导致错误的小部件是 Scaffold lib\home.dart:23

=========================================== ==================================

======== 渲染库捕获的异常==============================< /p>

每个孩子必须被布置一次。

导致错误的相关小部件是 Scaffold。

答案 11 :(得分:0)

在以下情况下可能会发生此错误:

  • 您使用 Navigator 2.0
  • 您使用ChildBackButtonDispatcher
  • 您热重载您的应用
  • 您忘记在 build 方法中优先:
class _HomeState extends State<Home> {
  HomeRouterDelegate _routerDelegate;
  final _state = HomeState();

  ChildBackButtonDispatcher _backButtonDispatcher;

  @override
  void initState() {
    super.initState();
    _routerDelegate = HomeRouterDelegate(_state);
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _backButtonDispatcher = Router.of(context)
        .backButtonDispatcher
        .createChildBackButtonDispatcher();
  }

  @override
  Widget build(BuildContext context) {
    // The app will throw an exception 'Each child must be laid out exactly once.'
    // without this line on each Hot Reload
    // https://stackoverflow.com/a/66258147/1321917
    _backButtonDispatcher.takePriority();
    return Router(
      routerDelegate: _routerDelegate,
      backButtonDispatcher: _backButtonDispatcher,
    );
  }
}

答案 12 :(得分:0)

widget 的构造函数中引用 State 时出现此错误:

class MyWidget extends StatefulWidget {
  MyWidget(this.data, {Key? key}) : super(key: key);

  final String data;

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

class _MyWidgetState extends State<MyWidget> {
  _MyWidgetState() {
    debugPrint(widget.data); // This line causes error.
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}