Dart Null safety error : Null check operator used on a null value

Dart Null safety error : Null check operator used on a null value

我收到这个错误,我明白了,但我不知道如何解决 当我尝试使用 profilPicker class.

的变量时发生此错误
class MyDrawerPages extends StatefulWidget {
    final ValueChanged<DrawerItem> onSelectedItem;
    final VoidCallback? onClick;
    const MyDrawerPages({
    Key? key,
    required this.onSelectedItem,
    this.onClick,
    }) : super(key: key);

    @override
    _MyDrawerPagesState createState() => _MyDrawerPagesState();
     }

    class _MyDrawerPagesState extends State<MyDrawerPages> {
    final signUpKey = GlobalKey<_ProfilPickerState>();
    var stringName = '';
     var stringTeam = '';

     @override
     Widget build(BuildContext context) {
    
      final name = signUpKey.currentState!.name;
      final team = signUpKey.currentState!.team;
      final bool isSignin = signUpKey.currentState!.isSignin;

    return Scaffold(
      body: Container(
        color: const Color(0xFFE26A2C),
        child: Column(
          children: [
            Padding(
              key: signUpKey,
              padding: const EdgeInsets.only(top: 20, bottom: 10),
              child: ListTile(
                leading: GestureDetector(
                  onTap: () {
                    Navigator.pushNamed(context, '/profil_picker');
                  },
                  child: const CircleAvatar(
                    backgroundColor: Color(0xFF463E3E),
                    child: Icon(
                      Icons.person,
                      size: 40,
                      color: Colors.white,
                    ),
                    radius: 22,
                  ),
                ),
                title: Text(
                  isSignin ? name.toString().toUpperCase() : stringName,
                  style: const TextStyle(color: Colors.white),
                ),
                subtitle: Text(
                    isSignin
                        ? team.toString()
                        : stringTeam,
                    style: const TextStyle(color: Colors.white)),
              ),
            ),
            SingleChildScrollView(
              child: Column(children: [listTileDrawer(context)]),
            ),
          ],
        ),
      ),
    );
    }

这里是ProfilPickerclass


class _ProfilPickerState extends State<ProfilPicker> {
  bool visible = false;
  File? image;

  late String name;
  late String team;
  TextEditingController nameController = TextEditingController();
  TextEditingController teamController = TextEditingController();

  var isSignin = true;

  Future pickeImage(ImageSource source) async {
    final image = await ImagePicker().pickImage(source: source);
    if (image == null) return;

    final saveImage = await saveImagepermanently(image.path);

    try {
      setState(() {
        this.image = saveImage;
      });
    } on Exception catch (e) {
      // ignore: avoid_print
      print('failed to pick image $e');
    }
  }

  bool signUp = true;

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: AppBar(
          iconTheme: const IconThemeData(color: Colors.black),
          backgroundColor: Colors.transparent,
          elevation: 0,
        ),
        backgroundColor: const Color(0xFFFFFFFF),
        body: Center(
          child: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                Column(
                  children: [
                    Container(
                      height: 150,
                      width: 150,
                      decoration: BoxDecoration(
                          color: Colors.blueGrey[200],
                          borderRadius: BorderRadius.circular(200)),
                      child: image != null
                          ? ClipOval(
                              child: Image.file(
                                image!,
                                width: 150,
                                height: 150,
                                fit: BoxFit.cover,
                              ),
                            )
                          : const Icon(
                              Icons.add_a_photo,
                              size: 30,
                            ),
                    ),
                  ],
                ),
                const SizedBox(
                  height: 100,
                ),
                signUp
                    ? Column(
                        children: [
                          Card(
                              margin:
                                  const EdgeInsets.symmetric(horizontal: 40),
                              child: ListTile(
                                onTap: () {
                                  setState(() {
                                    pickeImage(ImageSource.gallery);
                                    signUp = false;
                                  });
                                },
                                leading: const Icon(Icons.image_outlined),
                                title: const Text("Gallery"),
                              ),
                              color: Colors.blue[100]),
                          const SizedBox(
                            height: 10,
                          ),
                          Card(
                            color: Colors.blue[100],
                            margin: const EdgeInsets.symmetric(horizontal: 40),
                            child: ListTile(
                              onTap: () {
                                setState(() {
                                  pickeImage(ImageSource.camera);
                                  signUp = false;
                                });
                              },
                              leading: const Icon(Icons.camera),
                              title: const Text("Camera"),
                            ),
                          ),
                        ],
                      )
                    : Column(
                        children: [
                          _listTileBuilder(),
                          const SizedBox(
                            height: 30,
                          )
                        ],
                      )
              ],
            ),
          ),
        ),
      ),
    );
  }

  _listTileBuilder() {
    return SingleChildScrollView(
      child: Wrap(
        crossAxisAlignment: WrapCrossAlignment.center,
        children: [
          Padding(
            padding: const EdgeInsets.all(10),
            child: Column(
              children: [
                Container(
                    alignment: Alignment.topLeft,
                    padding: const EdgeInsets.fromLTRB(0, 10, 0, 4),
                    child: const Text('Profil')),
                const Padding(
                  padding: EdgeInsets.only(right: 50),
                  child: Divider(
                    indent: 4,
                    color: Colors.black,
                  ),
                ),
              ],
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(10),
            child: Column(
              children: [
                TextField(
                  controller: nameController,
                  maxLines: 1,
                  keyboardType: TextInputType.name,
                  style: const TextStyle(fontSize: 14),
                  decoration: InputDecoration(
                    filled: true,
                    fillColor: Colors.blue[100],
                    border: const OutlineInputBorder(
                        borderSide: BorderSide.none,
                        borderRadius: BorderRadius.all(Radius.circular(10))),
                    label: const Text('name',
                        style: TextStyle(fontStyle: FontStyle.italic)),
                  ),
                ),
                const Padding(padding: EdgeInsets.all(4)),
                TextField(
                  controller: teamController,
                  maxLines: 1,
                  keyboardType: TextInputType.name,
                  style: const TextStyle(fontSize: 14),
                  decoration: InputDecoration(
                    filled: true,
                    fillColor: Colors.blue[100],
                    border: const OutlineInputBorder(
                        borderSide: BorderSide.none,
                        borderRadius: BorderRadius.all(Radius.circular(10))),
                    label: const Text(
                      'Team',
                      style: TextStyle(fontStyle: FontStyle.italic),
                    ),
                  ),
                )
              ],
            ),
          ),
          const Padding(
            padding: EdgeInsets.all(20),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.end,
            children: [
              TextButton(
                  onPressed: () {
                    // Navigator.pop();
                  },
                  child: Text(
                    'cancel'.toUpperCase(),
                    style: const TextStyle(fontWeight: FontWeight.bold),
                  )),
              TextButton(
                  onPressed: () {
                    setState(() {
                      isSignin;
                      name = nameController.text;
                      team = teamController.text;
                    });
                  },
                  child: Text('ok'.toUpperCase(),
                      style: const TextStyle(fontWeight: FontWeight.bold)))
            ],
          )
        ],
      ),
    );
  }
}

我没有更多详细信息 提前致谢! 我在听你说 放纵我是初学者谢谢!

错误代码

════════ Exception caught by widgets library ═══════════════════════════════════ The following _CastError was thrown building MyDrawerPages(dirty, state: _MyDrawerPagesState#a6f02): Null check operator used on a null value

此错误是在对具有空值的变量使用 Null 检查运算符 (!) 时引起的。

您必须跟踪所有变量并找到这个空值或使用其他运算符来解决问题或检查该值是否不为空。 您可以使用 ??运算符并在 null 时给出替代值,如下所示

Text(name ?? 'Not Found')

     

您可以在这篇文章中找到您需要的关于 null 感知运算符的所有内容 Go To Article

问题就在这里

final name = signUpKey.currentState!.name;
final team = signUpKey.currentState!.team;

您正在尝试访问名称和团队,因为它们被标记为 late,它们应该不为空,但是在单击确定按钮之前您不会为它们分配值,在上面的构建方法中它们是空的。

因此您应该让它们可以为空,并检查它们是否为空。像这样:

String? name;
String? team;

...

final name = signUpKey.currentState!.name ?? ''; 
final team = signUpKey.currentState!.team ?? '';

试试这个,告诉我它是否有效!