[英]I am getting error on ontap how can i solve it is it because of null safety how can i solve it
[英]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.