简体   繁体   English

行的孩子不得包含任何 Null 值 Flutter 错误

[英]Row's Children Must Not Contain Any Null Values Flutter Error

I'm developing a Flutter app, and I am trying to create a reusable button widget to be used in various places throughout my app.我正在开发一个 Flutter 应用程序,并且我正在尝试创建一个可重用的按钮小部件,以便在我的应用程序的各个地方使用。 I want every button to be required to have text, and an onpressed function, with an option of having an image.我希望每个按钮都需要有文本和按下的 function,并可以选择有图像。 Whenever I try to create a button that doesn't have the buttonImage property, I get a "Row's Children must not contain any null values" error, and I'm having issues trying to solve it.每当我尝试创建一个没有 buttonImage 属性的按钮时,我都会收到“Row's Children 不得包含任何 null 值”错误,并且我在尝试解决它时遇到了问题。 Below is code for my ReusableButton Widget and the implementation.下面是我的 ReusableButton Widget 和实现的代码。 Any help is appreciated任何帮助表示赞赏

import 'package:flutter/material.dart';

class ReusableButton extends StatelessWidget {

  ReusableButton({
    this.buttonImage,
    @required this.buttonText,
    @required this.onPressed,
    this.buttonColor,
  });

  final String buttonText;
  final Function onPressed;
  final Color buttonColor;
  final Image buttonImage;



  @override
  Widget build(BuildContext context) {
    return OutlineButton(
      onPressed: onPressed,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)),
      highlightElevation: 0,
      borderSide: BorderSide(color: buttonColor),
      child: Padding(
        padding: const EdgeInsets.fromLTRB(0, 10, 0, 10),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            buttonImage,
            Text(
              buttonText,
              style: TextStyle(
                fontSize: 20,
                color: Colors.grey,
              ),
            ),
          ],

        ),
      ),
    );
  }
}

Here is the code in which I am implementing the ReusableButton widget这是我实现 ReusableButton 小部件的代码

class LoginPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Center(
            child: Container(
              child: Center(
                child: Column(

                  children: <Widget>[
                    ReusableButton(
                      buttonImage: Image.asset('images/google_logo.png', height: 25.0),
                      buttonText: 'UserName',
                      buttonColor: kButtonBorderColor,
                      onPressed: ()
                      {
                      },
                    ),

                    ReusableButton(
                      buttonText: 'Password',
                      buttonColor: kButtonBorderColor,
                      onPressed: ()
                      {
                      },
                    ),
                  ],
                ),
              ),
            ),
          ),
        ],
      )
    );
  }
}

You need to return Container() if buttonImage is null如果 buttonImage 为 null,则需要返回 Container()
Row widget do not know how to render null行小部件不知道如何渲染 null
you must tell Row widget to render empty content if it's null如果它是 null,您必须告诉 Row 小部件呈现空内容
Please see full code and demo below请参阅下面的完整代码和演示

children: <Widget>[
            buttonImage == null ? Container() : buttonImage,

code snippet代码片段

class ReusableButton extends StatelessWidget {

  ReusableButton({
    this.buttonImage,
    @required this.buttonText,
    @required this.onPressed,
    this.buttonColor,
  });

  final String buttonText;
  final Function onPressed;
  final Color buttonColor;
  final Image buttonImage;



  @override
  Widget build(BuildContext context) {
    return OutlineButton(
      onPressed: onPressed,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)),
      highlightElevation: 0,
      borderSide: BorderSide(color: buttonColor),
      child: Padding(
        padding: const EdgeInsets.fromLTRB(0, 10, 0, 10),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            buttonImage == null ? Container() : buttonImage,
            Text(
              buttonText,
              style: TextStyle(
                fontSize: 20,
                color: Colors.grey,
              ),
            ),
          ],

        ),
      ),
    );
  }
}

demo演示

在此处输入图像描述

full code完整代码

import 'package:flutter/material.dart';

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

class ReusableButton extends StatelessWidget {

  ReusableButton({
    this.buttonImage,
    @required this.buttonText,
    @required this.onPressed,
    this.buttonColor,
  });

  final String buttonText;
  final Function onPressed;
  final Color buttonColor;
  final Image buttonImage;



  @override
  Widget build(BuildContext context) {
    return OutlineButton(
      onPressed: onPressed,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(40)),
      highlightElevation: 0,
      borderSide: BorderSide(color: buttonColor),
      child: Padding(
        padding: const EdgeInsets.fromLTRB(0, 10, 0, 10),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            buttonImage == null ? Container() : buttonImage,
            Text(
              buttonText,
              style: TextStyle(
                fontSize: 20,
                color: Colors.grey,
              ),
            ),
          ],

        ),
      ),
    );
  }
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        // This is the theme of your application.
        //
        // Try running your application with "flutter run". You'll see the
        // application has a blue toolbar. Then, without quitting the app, try
        // changing the primarySwatch below to Colors.green and then invoke
        // "hot reload" (press "r" in the console where you ran "flutter run",
        // or simply save your changes to "hot reload" in a Flutter IDE).
        // Notice that the counter didn't reset back to zero; the application
        // is not restarted.
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  // This widget is the home page of your application. It is stateful, meaning
  // that it has a State object (defined below) that contains fields that affect
  // how it looks.

  // This class is the configuration for the state. It holds the values (in this
  // case the title) provided by the parent (in this case the App widget) and
  // used by the build method of the State. Fields in a Widget subclass are
  // always marked "final".

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // This call to setState tells the Flutter framework that something has
      // changed in this State, which causes it to rerun the build method below
      // so that the display can reflect the updated values. If we changed
      // _counter without calling setState(), then the build method would not be
      // called again, and so nothing would appear to happen.
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // This method is rerun every time setState is called, for instance as done
    // by the _incrementCounter method above.
    //
    // The Flutter framework has been optimized to make rerunning build methods
    // fast, so that you can just rebuild anything that needs updating rather
    // than having to individually change instances of widgets.
    return Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
      ),
      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: Column(
          // Column is also a layout widget. It takes a list of children and
          // arranges them vertically. By default, it sizes itself to fit its
          // children horizontally, and tries to be as tall as its parent.
          //
          // Invoke "debug painting" (press "p" in the console, choose the
          // "Toggle Debug Paint" action from the Flutter Inspector in Android
          // Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
          // to see the wireframe for each widget.
          //
          // Column has various properties to control how it sizes itself and
          // how it positions its children. Here we use mainAxisAlignment to
          // center the children vertically; the main axis here is the vertical
          // axis because Columns are vertical (the cross axis would be
          // horizontal).
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ReusableButton(
              buttonImage: Image.asset('assets/images/alarm.png', height: 25.0),
              buttonText: 'UserName',
              buttonColor: Colors.blue,
              onPressed: ()
              {
              },
            ),
            ReusableButton(
              buttonText: 'Password',
              buttonColor: Colors.blue,
              onPressed: ()
              {
              },
            ),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

You're not passing an image to the second button that very much Equal to 'passing a null value'您没有将图像传递给第二个按钮,这与“传递 null 值”非常相似

In constructor check whether the image is null, if it is null set an empty container which should solve the problem在构造函数中检查图像是否是 null,如果是 null 设置一个空容器应该可以解决问题

if(this.image==null) this.image = Container(width:0,height:0);  

or in short或简而言之

this.image?? = Container(width:0,height:0); 

Or else in build check for whether the image is not null if it is not null then only place it in the row或者在构建中检查图像是否不是 null 如果不是 null 然后只将它放在行中

If you ever need to add multiple child items to a Column based on a single "if":如果您需要基于单个“if”将多个子项添加到列:

Example:例子:

Column(
   children: [
              Container(),
              if (<some conditional statement>) ...[
                  Container(),
                  Container(),
                  Container(), 
                  Container()
              ],
    ] // children
), // Column

Or you can use shorthand buttonImage?? Container()或者您可以使用速记buttonImage?? Container() buttonImage?? Container() it is equally buttonImage == null? Container(): buttonImage, buttonImage?? Container()同样是buttonImage == null? Container(): buttonImage, buttonImage == null? Container(): buttonImage,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何解决 Flutter 错误列的子项不得包含任何 null 值,但在索引 0 处找到 null 值? - How to solve Flutter error Column's children must not contain any null values, but a null value was found at index 0? Flutter 错误列的子项不得包含任何 null 值,但在索引 0 处找到 null 值 - Flutter error Column's children must not contain any null values, but a null value was found at index 0 Flutter 错误:列的子项不得包含任何 null 值,但在索引 0 处找到 null 值 - Flutter error: Column's children must not contain any null values, but a null value was found at index 0 Flutter 函数错误:列的子项不得包含任何空值,但在索引 1 处发现空值 - Flutter function error: Column's children must not contain any null values, but a null value was found at index 1 列的子项不得包含任何 null 值,但在索引 13 处找到 null 值。 Flutter Z866408593C2F8BDF27 - Column's children must not contain any null values, but a null value was found at index 13. Flutter Function 行的子项不得包含任何 null 值,但在索引 2 处找到 null 值 - Row's children must not contain any null values, but a null value was found at index 2 列的子项不得包含任何 null 值,但在索引 0 处找到 null 值 - Column's children must not contain any null values, but null value was found at index 0 无效参数(输入):不得为 null - Flutter - Invalid argument(s) (input): Must not be null - Flutter dio http 获取错误 ArgumentError(无效参数(输入):不得为空)flutter - dio http get error ArgumentError (Invalid argument(s) (input): Must not be null) flutter Flutter来自ADB的意外故障:无效参数:源不得为空在设备上启动应用程序时出错 - Flutter Unexpected failure from adb: Invalid argument(s): The source must not be null Error launching application on device
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM