未处理的异常:在颤振中的“AuthBloc”实例中发生未处理的错误空值检查运算符

时间:2021-06-07 01:43:07

标签: android flutter dart dart-null-safety

我知道,很多人在这里问过类似的问题。但是没有解决方案对我有用,我无法理解解决方案。所以请有人帮助我。我将变量 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();
  }
}

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

1 个答案:

答案 0 :(得分:0)

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

这是具有适当空值处理的类:

class AuthUserChanged extends AuthEvent {
  final auth.User user;

  const AuthUserChanged({required this.user});

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

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

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

相关问题