首页 > 解决方案 > 未处理的异常:未处理的错误 Null 检查运算符用于空值,发生在 Flutter 中的“AuthBloc”实例中

问题描述

我知道,很多人在这里问过类似的问题。但是没有解决方案对我有用,我无法理解解决方案。所以请有人帮助我。我将变量声明user为非空(通过添加感叹号)。但不知何故,它返回 null。请有人通过追踪我如何得到这个空值来帮助我。

这是 auth_event.dart 文件 -

(第 17 行给出了错误(根据我的想法)。)

part of 'auth_bloc.dart';

abstract class AuthEvent extends Equatable {
  const AuthEvent();

  @override
  // TODO: implement stringify
  bool? get stringify => true;

  @override
  List<Object> get props => [];
}

class AuthUserChanged extends AuthEvent {
  final auth.User? user;  //Initial Value is null

  const AuthUserChanged({required this.user});  //Now the value is changed

  @override
  List<Object> get props => [user!];  //Still, the value being shown is null
  //TODO:  List<Object> get props => [user??auth.User];
}

class AuthLogoutRequested extends AuthEvent {}

这是 auth_bloc.dart 文件 -

import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:flutter/cupertino.dart';
import 'package:flutter_instagram_clone_final/blocs/blocs.dart';
import 'package:flutter_instagram_clone_final/repositories/auth/auth_repository.dart';

part 'auth_event.dart';
part 'auth_state.dart';

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  final AuthRepository?  _authRepository;
  StreamSubscription<auth.User?>? _userSubscription;

  AuthBloc({
    @required AuthRepository? authRepository
  }) : _authRepository = authRepository, super(AuthState.unknown()){
    _userSubscription = _authRepository!.user.listen((user) => add(AuthUserChanged(user: user)));
  }

  @override
  Future<void> close() {
    _userSubscription!.cancel();
    return super.close();
  }

  @override
  Stream<AuthState> mapEventToState (
         AuthEvent event,
      ) async* {
    if(event is AuthUserChanged) {
      yield* _mapAuthUserChangedToState(event);
    }
    else if(event is AuthLogoutRequested) {
       await _authRepository!.logOut();
    }
  }

  Stream<AuthState> _mapAuthUserChangedToState(AuthUserChanged event) async*{
    yield event.user != null
        ? AuthState.authenticate(user: event.user!)
        : AuthState.unauthenticated();
  }
}

如果需要更多信息,请评论出来,我会补充。

标签: androidflutterdartdart-null-safety

解决方案


您在事件类中处理空值很奇怪。

这是您的具有正确 null 处理的类:

class AuthUserChanged extends AuthEvent {
  final auth.User user;

  const AuthUserChanged({required this.user});

  @override
  List<Object> get props => [user];
}

该变量user永远不能为空,因为您required在构造函数中使用关键字对其进行了标记。现在从其余代码中删除任何!与该变量有关的内容。user

你的其他代码看起来也很奇怪。就像一个知识太少的转换工具跑过它并做错了。发生了什么?也许您应该逐行查看您的代码并首先修复概念上的错误,然后再担心编译器和运行时。


推荐阅读