I'm taking a course for Flutter and I think the course is a bit old, I'm trying to upgrade an old code to null safety, but since I'm just starting to learn null safety, I'm encountering errors and I couldn't figure out why, I would be glad if you could help.
"auth_event"
part of 'auth_bloc.dart';
abstract class AuthEvent extends Equatable {
const AuthEvent();
@override
bool? get stringify => true;
@override
List<User?> get props => [];
}
class AuthUserChanged extends AuthEvent {
final auth.User? user;
const AuthUserChanged({this.user});
@override
List<User?> get props => [user];
}
class AuthLogoutRequested extends AuthEvent {}
final auth.User? user;
Context: 'user' refers to a property so it couldn't be promoted.
"auth_state"
part of 'auth_bloc.dart';
enum AuthStatus { unknown, authenticated, unauthenticated }
class AuthState extends Equatable {
final auth.User? user;
final AuthStatus status;
const AuthState({
this.user,
this.status = AuthStatus.unknown,
});
factory AuthState.unknown() => const AuthState();
factory AuthState.authenticated({required auth.User user}) {
return AuthState(user: user, status: AuthStatus.authenticated);
}
factory AuthState.unauthenticated() =>
const AuthState(status: AuthStatus.unauthenticated);
@override
bool? get stringify => true;
@override
List<Object?> get props => [user, status];
}
"auth_bloc"
import 'dart:async';
import 'package:basla/depolar/depolar.dart';
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:firebase_auth/firebase_auth.dart';
import 'package:meta/meta.dart';
part 'auth_event.dart';
part 'auth_state.dart';
class AuthBloc extends Bloc<AuthEvent, AuthState> {
final AuthRepository _authRepository;
late 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.authenticated(user: event.user)
: AuthState.unauthenticated();
}
}
(user: event.user)
Error: The argument type 'User?' can't be assigned to the parameter type 'User' because 'User?' is nullable and 'User' isn't.
- 'User' is from 'package:firebase_auth/firebase_auth.dart'
Please alert me for codes that i need to edit..
CodePudding user response:
The problem is that your authenticated
state is accepted by a not null auth.User
. So, just update it to:
factory AuthState.authenticated({required auth.User? user})
Another solution is adding !
to event.user
:
yield event.user != null
? AuthState.authenticated(user: event.user!)
: AuthState.unauthenticated();
Anw, you should read the documentation before you want to go any further with flutter/dart updates: https://dart.dev/null-safety/understanding-null-safety