繁体   English   中英

_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
                  ],
                ),
              ),
            ),
          );
        });
  }
}

只需检查您是否从firebaseData变量中的 firebase 获取数据,并像这样重构您的代码

 subtitle: Text(firebaseData[i]['Course Group']??"Some Text",),

如果您的变量返回null ,那么它将在右侧打印硬编码文本并避免应用程序崩溃。

在任何时候,所有相关服务都可能被视为“null”。 我建议使任何变量都取决于互联网交互,可以为空。 因此,当您使用它们时,您可以使用占位符值。

例如

String? theUserNameFetchedFromInternet

// while using 

Text(theUserNameFetchedFromInternet ?? "john")

这种类型的处理可以防止大量的超时崩溃,这就是 dart 是零安全的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM