飞镖类中的错误

问题描述

所以我正在开发这个测验应用程序,我只是为我的问题和答案创建了一个类。但是 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',];

  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",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++;
                });
              },child: Container(
                color: Colors.red,child: Center(
                  child: Text(
                    "False",onpressed: () {
                setState(() {
                  bool risCorretta = domandeBank[qNumber].risposte;
                  if (risCorretta == false) {
                    scoreKeeper.add(
                      Icon(
                        Icons.check,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 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.

解决方法

首先你可以省略这部分。

domande = d;
risposte = r;

constructor 参数分配给实例变量的模式非常常见,但是使用 dart,您可以像下面的代码片段那样完成。
现在我们来解决你的问题。首先,您使用的是 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});
}
,

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

当您使用以下代码时:

class Domande {
  String domande;
  bool risposte;

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

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

var item = Domande();

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

class Domande {
  String? domande; // nullable
  bool? risposte; // nullable

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

那么,无论何时使用 Domande 类,都需要处理 domanderisposte 的空值。

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

class Domande {
  String domande;
  bool risposte;

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

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

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