提问人:Badriya Haddad 提问时间:5/24/2022 更新时间:5/24/2022 访问量:379
_TypeError(类型“Null”不是类型“String”的子类型)
_TypeError (type 'Null' is not a subtype of type 'String')
问:
我不知道发生了什么,但我试图通过使其可为空来解决这个问题,但它没有用。 我想查看数据库中的元素,因此我将它们置于“for”循环中。 但它仍然向我显示异常_TypeError(类型“Null”不是“String”类型的子类型) 那么我应该怎么做才能解决这个问题呢? 这是异常的屏幕截图:在此处输入图像描述
这是我的代码:
`import 'pac`kage:blackboard/view/Teacher/Addcourse1.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:blackboard/constraints/textstyle.dart';
import 'package:flutter/material.dart';
import 'package:blackboard/setting/colors.dart';
class CoursesT extends StatefulWidget {
const CoursesT({Key? key}) : super(key: key);
@override
State<CoursesT> createState() => _CoursesTState();
}
class _CoursesTState extends State<CoursesT> {
// Getting Student all Records
final Stream<QuerySnapshot>? studentRecords =
FirebaseFirestore.instance.collection('CourseStudent').snapshots();
// For Deleting Users
CollectionReference? delUser =
FirebaseFirestore.instance.collection('CourseStudent');
Future<void> _delete(id) {
return delUser!
.doc(id)
.delete()
.then((value) => print('User Deleted'))
.catchError((_) => print('Something Error In Deleted User'));
}
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: studentRecords,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) {
print('Something Wrong in HomePage');
}
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
}
// Storing Data
final List? firebaseData = [];
snapshot.data?.docs.map((DocumentSnapshot documentSnapshot) {
Map store = documentSnapshot.data() as Map<String, dynamic>;
firebaseData!.add(store);
store['id'] = documentSnapshot.id;
}).toList();
return Scaffold(
appBar: AppBar(
backgroundColor: BBColors.primary6,
title: Text("Your Courses"),
leading: Icon(Icons.menu, color: Colors.white),
actions: [
Icon(
Icons.search,
),
SizedBox(
width: 20,
),
],
),
body: Container(
margin: const EdgeInsets.all(8),
child: SingleChildScrollView(
child: ListView(
shrinkWrap: true,
children: [
for (var i = 0; i < firebaseData!.length; i++) ...[
Card(
elevation: 4.0,
child: Column(
children: [
ListTile(
title: Text(
firebaseData[i]['Course Title'],
),
subtitle: Text(
firebaseData[i]['Course Group'],
),
trailing: IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
const AddCourse1(),
),
);
},
icon: const Icon(
Icons.add,
color: BBColors.bg1,
),
),
),
Container(
padding: EdgeInsets.all(16.0),
alignment: Alignment.centerLeft,
child: Text(
firebaseData[i]['Course Description'],
),
),
ButtonBar(
children: [
// IconButton(
// onPressed: () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => EditPage(
// docID: firebaseData[i]['id'],
// ),
// ),
// );
// },
// icon: const Icon(
// Icons.edit,
// color: Colors.orange,
// ),
// ),
IconButton(
onPressed: () {
_delete(firebaseData[i]['id']);
//print(firebaseData);
},
icon: const Icon(
Icons.delete,
color: Colors.red,
),
),
],
)
],
)),
], //this is loop
],
),
),
),
);
});
}
}
答:
2赞
Ahmad hassan
5/24/2022
#1
只需检查您是否在 firebaseData 变量中从 firebase 获取数据,并像这样重构您的代码
subtitle: Text(firebaseData[i]['Course Group']??"Some Text",),
如果您的变量返回 null,那么它将在右侧打印硬编码文本并保存应用程序免于崩溃。
评论
0赞
Badriya Haddad
5/24/2022
实际上,它只显示 “” 中的内容,而不是数据库中的元素
0赞
Ahmad hassan
5/24/2022
因为它从您的数据库中获取 NULL 值
0赞
Mehmet Karanlık
5/24/2022
#2
任何时候与服务相关的所有服务都可能接收为“null”。我建议使任何变量都取决于互联网交互,可为空。因此,当您使用它们时,您可以具有占位符值。
例如
String? theUserNameFetchedFromInternet
// while using
Text(theUserNameFetchedFromInternet ?? "john")
这种类型的处理可以防止大量碰撞,这就是为什么飞镖是零安全的。
评论
0赞
Badriya Haddad
5/24/2022
我做了同样的事情,但它在屏幕上向我展示了数据库中的元素,它向我展示了它在“”中的内容,例如约翰
0赞
Mehmet Karanlık
5/25/2022
我不明白你的意思,只是创建一个具有可为空属性的模型类并将快照数据转换为它。然后,如果它显示占位符值,例如“john”,则表示其 null。
评论