【问题标题】:Errors in dart class飞镖类中的错误
【发布时间】:2021-07-31 08:26:32
【问题描述】:

所以我正在开发这个测验应用程序,我只是为我的问题和答案创建一个类。但是vscode一直告诉我有错误。有人可以帮帮我吗?

这里是 main.dart

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

void main() {
  runApp(HomePage());
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        backgroundColor: Colors.grey[900],
        body: SafeArea(
          child: Padding(
            padding: EdgeInsets.symmetric(horizontal: 10.0),
            child: Quizzler(),
          ),
        ),
      ),
    );
  }
}

class Quizzler extends StatefulWidget {
  @override
  QuizzlerState createState() => QuizzlerState();
}

class QuizzlerState extends State<Quizzler> {
  List<Widget> scoreKeeper = [];

  List<Domande> domandeBank = [
    Domande(d: 'Il sole è una stella', r: true),
    Domande(d: 'Il latte è verde', r: false),
    Domande(d: 'Il mare è blu', r: true),
  ];

  int qNumber = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Expanded(
          flex: 5,
          child: Padding(
            padding: const EdgeInsets.all(10.0),
            child: Center(
              child: Text(
                domandeBank[qNumber].domande,
                style: TextStyle(color: Colors.white),
                textAlign: TextAlign.center,
              ),
            ),
          ),
        ),
        Expanded(
          child: Padding(
            padding: const EdgeInsets.all(10.0),
            child: TextButton(
              style: TextButton.styleFrom(padding: EdgeInsets.zero),
              child: Container(
                color: Colors.green,
                height: 50,
                width: double.infinity,
                child: Center(
                  child: Text(
                    "True",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
              onPressed: () {
                setState(() {
                  bool risCorretta = domandeBank[qNumber].risposte;
                  if (risCorretta == true) {
                    scoreKeeper.add(
                      Icon(
                        Icons.check,
                        color: Colors.green,
                      ),
                    );
                  } else {
                    scoreKeeper.add(
                      Icon(
                        Icons.close,
                        color: Colors.red,
                      ),
                    );
                  }
                  qNumber++;
                });
              },
            ),
          ),
        ),
        Expanded(
          child: Padding(
            padding: const EdgeInsets.all(10.0),
            child: TextButton(
              style: TextButton.styleFrom(padding: EdgeInsets.zero),
              child: Container(
                color: Colors.red,
                height: 50,
                width: double.infinity,
                child: Center(
                  child: Text(
                    "False",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
              onPressed: () {
                setState(() {
                  bool risCorretta = domandeBank[qNumber].risposte;
                  if (risCorretta == false) {
                    scoreKeeper.add(
                      Icon(
                        Icons.check,
                        color: Colors.green,
                      ),
                    );
                  } else {
                    scoreKeeper.add(
                      Icon(
                        Icons.close,
                        color: Colors.red,
                      ),
                    );
                  }
                  qNumber++;
                });
              },
            ),
          ),
        ),
        Row(
          children: scoreKeeper,
        ),
      ],
    );
  }
}

这里是 question.dart 类

class Domande {
  String domande;
  bool risposte;

  Domande({String d, bool r}) {
    domande = d;
    risposte = r;
  }
}

我得到的错误:

Non-nullable instance field 'domande' must be initialized.
Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.


Non-nullable instance field 'risposte' must be initialized.
Try adding an initializer expression, or add a field initializer in this constructor, or mark it 'late'.


The parameter 'd' can't have a value of 'null' because of its type, but the implicit default value is 'null'.
Try adding either an explicit non-'null' default value or the 'required' modifier.

The parameter 'r' can't have a value of 'null' because of its type, but the implicit default value is 'null'.
Try adding either an explicit non-'null' default value or the 'required' modifier.

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    首先你可以省略这部分。

    domande = d;
    risposte = r;
    

    constructor 参数分配给实例变量的模式非常常见,但是使用 dart 你可以像下面的代码 sn-p 那样做。
    现在我们来解决您的问题。首先,您使用的是null-safety,并创建了您的变量不是nullable。然后你用optional parameters创建了你的构造函数,这意味着这些参数可以是null,但你的类变量不能为空。这就是您出现此错误的原因。
    您可以使用关键字required 来解决此问题,这意味着您的变量是mandatory

    class Domande {
      String domande;
      bool risposte;
    
      Domande({required this.domande, required this.risposte});
    }
    

    解决此问题的另一种方法是使用? 将变量设为nullable。但是,如果这些变量是null,请确保您处理这种情况。

    class Domande {
      String? domande;
      bool? risposte;
    
      Domande({this.domande, this.risposte});
    }
    

    【讨论】:

      【解决方案2】:

      错误与Null Safety in Flutter 有关。这基本上意味着,您需要处理代码中的 null 值。

      当您使用以下代码时:

      class Domande {
        String domande;
        bool risposte;
      
        Domande({String d, bool r}) {
          domande = d;
          risposte = r;
        }
      }
      

      在构造函数中,Domande({String d, bool r})你定义了一个非必需参数,那么你可以使用下面的代码:

      var item = Domande();
      

      默认参数dr为空。但是 Null Safety 功能会强制您定义可为空的参数。因此,您需要将代码更改为:

      class Domande {
        String? domande; // nullable
        bool? risposte; // nullable
      
        Domande({String d, bool r}) {
          domande = d;
          risposte = r;
        }
      }
      

      然后,每当您使用Domande 类时,您都需要处理domanderisposte 的空值。

      或者,您可以通过在参数中添加 required 关键字来强制您的 Domande 创建始终具有非空值:

      class Domande {
        String domande;
        bool risposte;
      
        Domande({required String d, required bool r}) {
          domande = d;
          risposte = r;
        }
      }
      

      因此,您不需要处理空值。但是您强制使用以下代码创建对象:

      var item = Domande(d: "d", r:false);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 2013-04-29
        • 2019-06-25
        • 2021-07-29
        相关资源
        最近更新 更多