在我的 flutter 应用程序中对 null 值使用 Null 检查运算符

问题描述 投票:0回答:1

我目前正在开发 Firebase Instagram 克隆,我遇到了“添加帖子”屏幕的问题。当用户导航到此屏幕时,他们可以选择要上传的图像。然而,选择图像后,屏幕立即变红,显示错误消息:

空值检查运算符用于空值

我正在添加添加帖子文件中的相关代码片段、错误消息以及指向该项目的 GitHub 存储库的链接。

GitHub: https://github.com/Aabis-Ahmed-Hassan/Instagram-Clone-Firebase

添加后屏幕代码:

import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:instagram_clone_firebase/post/upload_post_data.dart';
import 'package:instagram_clone_firebase/utils/colors.dart';
import 'package:instagram_clone_firebase/utils/constants/padding.dart';
import 'package:instagram_clone_firebase/view_modal/user_provider.dart';
import 'package:provider/provider.dart';

import '../utils/utils.dart';

class AddPost extends StatefulWidget {
  const AddPost({super.key});

  @override
  State<AddPost> createState() => _AddPostState();
}

class _AddPostState extends State<AddPost> {
  var _postImage;

  chooseImage(BuildContext context) async {
    return showDialog(
        context: context,
        builder: (context) => SimpleDialog(
              title: Text(
                'Pick an Image',
              ),
              children: [
                SimpleDialogOption(
                  onPressed: () async {
                    Navigator.pop(context);
                    _postImage = await Utils.pickImage(ImageSource.camera);
                    setState(() {});
                  },
                  child: Text(
                    'Capture a Picture',
                  ),
                ),
                SimpleDialogOption(
                  onPressed: () async {
                    Navigator.pop(context);
                    _postImage = await Utils.pickImage(ImageSource.gallery);
                    setState(() {});
                  },
                  child: Text(
                    'Choose from Gallery',
                  ),
                ),
                SimpleDialogOption(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  child: Text(
                    'Cancel',
                  ),
                ),
              ],
            ));
  }

  TextEditingController _postDescription = TextEditingController();

  bool loading = false;

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    _postDescription.dispose();
  }

  postIt(
    String description,
    String username,
    String profileImage,
    String uid,
  ) async {
    setState(() {
      loading = true;
    });

    await uploadPostData(_postImage, uid, description, username, profileImage);

    setState(
      () {
        loading = false;
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    double height = MediaQuery.of(context).size.height * 1;
    double width = MediaQuery.of(context).size.width * 1;

    // UserModal user = Provider.of<UserProvider>(context, listen: false).getUser;
    UserProvider user = Provider.of<UserProvider>(context, listen: false);
    print('build');
    return _postImage == null
        ? Center(
            child: IconButton(
              onPressed: () async {
                await chooseImage(context);
              },
              icon: Icon(
                Icons.upload,
              ),
            ),
          )
        : Scaffold(
            appBar: AppBar(
              backgroundColor: mobileBackgroundColor,
              leading: Icon(
                Icons.arrow_back,
              ),
              title: Text(
                'Add Post',
              ),
              centerTitle: false,
              actions: [
                InkWell(
                  onTap: () {
                    return postIt(
                      _postDescription.text.toString(),
                      user.getUser.username.toString(),
                      user.getUser.imageUrl.toString(),
                      user.getUser.uid.toString(),
                    );
                  },
                  child: Text(
                    'Post',
                    style: TextStyle(
                      color: Colors.blue,
                      fontWeight: FontWeight.w500,
                      fontSize: 16,
                    ),
                  ),
                ),
                SizedBox(
                  width: width * 0.035,
                ),
              ],
            ),
            body: Padding(
              padding: EdgeInsets.symmetric(horizontal: width * padding),
              child: Column(
                children: [
                  Row(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Expanded(
                        flex: 4,
                        child: Column(
                          mainAxisAlignment: MainAxisAlignment.center,
                          children: [
                            CircleAvatar(
                              radius: width * 0.075,
                              backgroundImage: NetworkImage(
                                user.getUser.toString(),
                              ),
                            ),
                          ],
                        ),
                      ),
                      Expanded(
                        flex: 9,
                        child: TextFormField(
                          controller: _postDescription,
                          decoration: InputDecoration(
                            hintText: 'Write a caption...',
                            border: InputBorder.none,
                          ),
                        ),
                      ),
                      Expanded(
                        flex: 3,
                        // child: Image.file(_postImage!),
                        child: _postImage != null
                            ? Image.file(_postImage!)
                            : Container(),
                      ),
                    ],
                  ),
                  Divider(),
                  Container(),
                  loading
                      ? CircularProgressIndicator()
                      : Container(
                          height: 50,
                          width: 50,
                          color: Colors.blue,
                        ),
                ],
              ),
            ),
          );
  }
}

错误:

======== 小部件库捕获异常====================================== ===================
构建 AddPost(dirty, dependency: [MediaQuery, _LocalizationsScope-[GlobalKey#8b487]], state: _AddPostState#be0c8):
时抛出以下 _TypeError 对空值使用空检查运算符

导致错误的相关小部件是:
AddPost AddPost:文件:///C:/Users/aabis/StudioProjects/Instagram-Clone-Firebase/lib/view/responsiveness/mobile_layout.dart:18:5
当异常抛出时,这是堆栈:
#0 UserProvider.getUser (包:instagram_clone_firebase/view_modal/user_provider.dart:8:33)
#1 _AddPostState.build(包:instagram_clone_firebase/view/add_post.dart:159:38)
#2 StatefulElement.build (包:flutter/src/widgets/framework.dart:5592:27)
#3 ComponentElement.performRebuild(包:flutter/src/widgets/framework.dart:5480:15)
#4 StatefulElement.performRebuild (包:flutter/src/widgets/framework.dart:5643:11)
#5 Element.rebuild (包:flutter/src/widgets/framework.dart:5196:7)
#6 BuildOwner.buildScope(包:flutter/src/widgets/framework.dart:2904:19)
#7 WidgetsBinding.drawFrame(包:flutter/src/widgets/binding.dart:989:21)
#8 RendererBinding._handlePersistentFrameCallback (包:flutter/src/rendering/binding.dart:448:5)
#9 SchedulerBinding._invokeFrameCallback (包:flutter/src/scheduler/binding.dart:1386:15)
#10 SchedulerBinding.handleDrawFrame (包:flutter/src/scheduler/binding.dart:1311:9)
#11 SchedulerBinding.scheduleWarmUpFrame。 (包:flutter/src/scheduler/binding.dart:1034:7)
#15 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
(从 _Timer 类和 dart:async-patch 中删除了 3 个帧)\

我尝试过不同的事情,但都是徒劳。

flutter firebase null-check
1个回答
0
投票

您在第 159 行中使用了 user.getUser() 代替了 user.getUser().imageUrl.toString()

© www.soinside.com 2019 - 2024. All rights reserved.