簡體   English   中英

我在 Flutter 中收到空參數錯誤,我該如何解決?

[英]I am getting null parameter error in Flutter, how can I solve it?

我正在學習 Flutter 並且我正在制作一個應用程序作為演示,但我無法解決這個錯誤。 即使我已經給參數賦值了,但是當我運行它時,我得到一個錯誤,它不能為空。

student.dart 代碼

class Student {
  String firstName;
  String lastName;
  String status;
  int grade;

  Student(String firstName, String lastName, int grade) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.status = "Geçti";
    this.grade = grade;
  }
}

main.dart 代碼

List<Student> students = [Student("Engin", "Demiroğ", 75), Student("İsmail", "Güner", 65), Student("Aykut", "Elmas", 88), Student("Cengiz", "Han", 100)];

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Demo1"),
      ),
      body: buildBody(context),
    );
  }

  Widget buildBody(BuildContext context) {
    return Column(
      children: [
        Expanded(
          child: ListView.builder(
              itemCount: students.length,
              itemBuilder: (BuildContext context, int index) {
                return Text(students[index].firstName);
              }),
        ),

我得到的錯誤

在此處輸入圖片說明

Dart 最近引入了空安全。 它可以防止你犯很多錯誤。 更多信息: https : //dart.dev/null-safety/understanding-null-safety

解決問題的最佳方法是了解哪些變量可以為空或不可為空。

class Student {
  String? firstName;
  String? lastName; ///nullable
  String status; /// non-nullable
  int? grade;

  Student({this.firstName, this.lastName, this.status = 'Geçti', this.grade});
}

在這種情況下,只有變量狀態不能為空,並且它的值由構造函數設置為“Geçti” 所有其他變量都可以為空。

如果啟用空安全,則必須在使用不可空變量之前初始化它們的值。 來源:文檔以獲取更多信息。

默認情況下啟用空安全 如上所述,您需要為這些變量分配一個默認值。

可以使用 dart 語法糖來重寫您的類來初始化變量(文檔

class Student {
  String firstName = "";
  String lastName = "";
  String status = "";
  int grade = 0;
    
  Student(this.firstName, this.lastName, this.grade);
}

使用該語法初始化變量,我們不需要為它們指定默認值,因此刪除不必要的默認值:

class Student {
  String firstName;
  String lastName;
  int grade;
  String status = "";
    
  Student(this.firstName, this.lastName, this.grade);
}

將構造函數中初始化的變量聲明為final也很常見(只能初始化一次)

class Student {
  final String firstName;
  final String lastName;
  final int grade;
  String status = "";
    
  Student(this.firstName, this.lastName, this.grade);
}

我建議看一下Dart 語言之旅

發生這種情況是因為您的變量類型不可為空,但您沒有使用值對其進行初始化。 要解決此問題,請使用關鍵字late

class Student {
  late String firstName;
  late String lastName;
  late String status;
  late int grade;

  Student(this.firstName, this.lastName, this.grade) {
    this.status = "Geçti";
  }
}

為每個屬性的類型添加問號以表示它可以為空:

class Student {
  String? firstName;
  String? lastName;
  String? status;
  int? grade;

Dart 是空安全的,因此由於您聲明的類的新屬性不帶問號,它會解釋該值永遠不會為空,但最初它們的值都是空的,因此會出現錯誤。 我建議閱讀更多關於null 安全特性的信息,因為它是 Dart/Flutter 的一個非常重要的概念。

P/s:要使用可空屬性(例如String? firstName ,將它與??用於那些不接受可空值的小部件。例如:

Text(student.firstName ?? ‘Empty name’)

在這里, ?? 意思是,如果student.firstName為空,則使用此Empty name字符串作為值。 由於Text需要一個非空值,我們需要確保在firstName為空的情況下,我們有一個默認值以避免傳入可為空的值。

Flutter 在空值和初始化方面可能很嚴重。 即使實際上您分配了值,它也不會“相信”您,並引發構建錯誤。 例如,請參見此處 但是為了快速修復,您可以將Student類的成員標記為late ,實際上您向 Flutter 承諾,稍后您將分配值:

class Student {
  late String firstName;
  late String lastName;
  late String status;
  late int grade;
...

你有很多其他選擇,但這個可以作為入門,我試過了。

從 Dart 2.12 開始,您需要指定參數是否可以為空,反之亦然。 請看下面的代碼

class Student {
  final String firstName;
  final String lastName;
  final String status;
  final int grade;

  Student({required this.firstName, required this.lastName, required this.status, required this.grade,});
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM