当我尝试注册新用户时,会出现此消息。我使用 Bloc 的干净架构 AuthBloc._onAuthSignUp。 (包:z_app_proj/features/auth/presentation/bloc/auth_bloc.dart:216:17) I/flutter ( 7999): │ #1 Left.match (包:fpdart/src/either.dart:614:72) 我/颤动(7999):├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ I/flutter ( 7999): │ ⛔ NoSuchMethodError: 在 null 上调用了 getter 'error'。 I/颤动 (7999): │ ⛔ 接收器: null I/flutter ( 7999): │ ⛔ 尝试调用: 错误 我/颤抖(7999):└──────────────────────────
这是我的代码块
/* import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:logger/logger.dart';
import 'package:z_app_proj/core/common/cubits/app_user/app_user_cubit.dart';
import 'package:z_app_proj/core/common/widgets/entities/user.dart';
import 'package:z_app_proj/core/usecase/usecase.dart';
import 'package:z_app_proj/features/auth/domain/usecases/current_user.dart';
import 'package:z_app_proj/features/auth/domain/usecases/user_login.dart';
import 'package:z_app_proj/features/auth/domain/usecases/user_sign_up.dart';
part 'auth_event.dart';
part 'auth_state.dart';
class AuthBloc extends Bloc<AuthEvent, AuthState> {
final UserSignUp _userSignUp;
final UserLogin _userLogin;
final CurrentUser _currentUser;
final AppUserCubit _appUserCubit;
AuthBloc({
required UserSignUp userSignUp,
required UserLogin userLogin,
required CurrentUser currentUser,
required AppUserCubit appUserCubit,
}) : _userSignUp = userSignUp,
_userLogin = userLogin,
_currentUser = currentUser,
_appUserCubit = appUserCubit,
super(AuthInitial()) {
on<AuthEvent>((_, emit) => emit(AuthLoading()));
on<AuthSignUp>(_onAuthSignUp);
on<AuthLogin>(_onAuthLogin);
on<AuthIsUserLoggedIn>(_isUserLoggedIn);
// on<SignInWithGoogleEvent>(_signInWithGoogle);
}
final Logger _logger = Logger();
void _isUserLoggedIn(
AuthIsUserLoggedIn event,
Emitter<AuthState> emit,
) async {
final res = await _currentUser(NoParams());
res.fold(
(l) {
emit(AuthFailure(l.message));
},
(r) => _emitAuthSuccess(r, emit),
);
}
/* void _onAuthSignUp(
AuthSignUp event,
Emitter<AuthState> emit,
) async {
final res = await _userSignUp(
UserSignUpParams(
email: event.email,
password: event.password,
name: event.name,
role: event.role,
),
);
res.fold(
(failure) {
emit(AuthFailure(failure.message));
},
(user) => _emitAuthSuccess(user, emit),
);
} */
void _onAuthSignUp(
AuthSignUp event,
Emitter<AuthState> emit,
) async {
final res = await _userSignUp(
UserSignUpParams(
email: event.email,
password: event.password,
name: event.name,
role: event.role,
),
);
res.fold(
(failure) {
_logger.e(failure.error);
emit(AuthFailure(failure.error));
},
(user) => _emitAuthSuccess(user, emit),
);
}
/* void _onAuthLogin(
AuthLogin event,
Emitter<AuthState> emit,
) async {
final res = await _userLogin(
UserLoginParams(
email: event.email,
password: event.password,
role: event.role,
),
);
res.fold(
(l) {
_logger.e(l.message);
emit(AuthFailure(l.message));
},
(r) => _emitAuthSuccess(r, emit),
);
}
*/
void _onAuthLogin(
AuthLogin event,
Emitter<AuthState> emit,
) async {
try {
final res = await _userLogin(
UserLoginParams(
email: event.email,
password: event.password,
role: event.role,
),
);
res.fold(
(l) {
_logger.e(l.message);
emit(AuthFailure(l.message));
},
(r) async {
_emitAuthSuccess(r, emit);
},
);
} catch (e) {
_logger.e(e.toString());
emit(AuthFailure('An unexpected error occurred'));
}
}
void _emitAuthSuccess(
User user,
Emitter<AuthState> emit,
) {
_appUserCubit.updateUser(user);
emit(AuthSuccess(user));
}
}
*/
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:logger/logger.dart';
import 'package:z_app_proj/core/common/cubits/app_user/app_user_cubit.dart';
import 'package:z_app_proj/core/common/widgets/entities/user.dart';
import 'package:z_app_proj/core/usecase/usecase.dart';
import 'package:z_app_proj/features/auth/domain/usecases/current_user.dart';
import 'package:z_app_proj/features/auth/domain/usecases/user_login.dart';
import 'package:z_app_proj/features/auth/domain/usecases/user_sign_up.dart';
part 'auth_event.dart';
part 'auth_state.dart';
class AuthBloc extends Bloc<AuthEvent, AuthState> {
final UserSignUp _userSignUp;
final UserLogin _userLogin;
final CurrentUser _currentUser;
final AppUserCubit _appUserCubit;
AuthBloc({
required UserSignUp userSignUp,
required UserLogin userLogin,
required CurrentUser currentUser,
required AppUserCubit appUserCubit,
}) : _userSignUp = userSignUp,
_userLogin = userLogin,
_currentUser = currentUser,
_appUserCubit = appUserCubit,
super(AuthInitial()) {
on<AuthEvent>((_, emit) => emit(AuthLoading()));
on<AuthSignUp>(_onAuthSignUp);
on<AuthLogin>(_onAuthLogin);
on<AuthIsUserLoggedIn>(_isUserLoggedIn);
}
final Logger _logger = Logger();
void _isUserLoggedIn(
AuthIsUserLoggedIn event,
Emitter<AuthState> emit,
) async {
final res = await _currentUser(NoParams());
res.fold(
(l) => emit(AuthFailure(l.message)),
(r) => _emitAuthSuccess(r, emit),
);
}
void _onAuthSignUp(
AuthSignUp event,
Emitter<AuthState> emit,
) async {
final res = await _userSignUp(
UserSignUpParams(
email: event.email,
password: event.password,
name: event.name,
role: event.role,
),
);
res.fold(
(failure) {
_logger.e(failure.message);
emit(AuthFailure(failure.message));
},
(user) => _emitAuthSuccess(user, emit),
);
}
void _onAuthLogin(
AuthLogin event,
Emitter<AuthState> emit,
) async {
final res = await _userLogin(
UserLoginParams(
email: event.email,
password: event.password,
role: event.role,
),
);
res.fold(
(l) => emit(AuthFailure(l.message)),
(r) => _emitAuthSuccess(r, emit),
);
}
void _emitAuthSuccess(
User user,
Emitter<AuthState> emit,
) {
_appUserCubit.updateUser(user);
emit(AuthSuccess(user));
}
}
Future<UserModel> signUpWithEmailPassword({
required String name,
required String email,
required String password,
required String role,
}) async {
try {
// Step 1: Insert the role into the roles table
final roleResponse = await supabaseClient.from('roles').insert({
'name': role,
});
if (roleResponse.error != null) {
throw const ServerException('Role insert error!');
}
final roleId = roleResponse.data?[0]['id']; // Use the generated role ID
// Step 2: Sign up the user
final response = await supabaseClient.auth.signUp(
password: password,
email: email,
data: {
'name': name,
'role_id': roleId, // Use the generated role ID
},
);
if (response.user == null) {
throw const ServerException('User is null!');
}
// Step 3: Insert the user profile
/* final profileResponse = await supabaseClient.from('profiles').insert({
'id': response.user!.id,
'updated_at': DateTime.now().toIso8601String(),
'username': '',
'full_name': name,
'avatar_url': '',
'website': '',
'role_name': role,
});
if (profileResponse.error != null) {
throw const ServerException('Profile insert error!');
}
*/
return UserModel.fromJson({
...response.user!.toJson(),
//'role': role,
});
} on AuthException catch (e) {
throw ServerException(e.message);
} catch (e) {
throw ServerException(e.toString());
}
}
这是supabase中的代码数据库
create table roles (
id bigint primary key generated always as identity,
name text unique not null
);
create table profiles (
id uuid references auth.users on delete cascade not null primary key,
updated_at timestamp with time zone,
username text unique,
full_name text,
avatar_url text,
website text,
role_name text not null references roles (name) on delete cascade,
constraint username_length check (char_length(username) >= 3)
);
alter table profiles
enable row level security;
create policy "Public profiles are viewable by everyone." on profiles
for select using (true);
create policy "Users can insert their own profile." on profiles
for insert with check ((select auth.uid()) = id);
create policy "Users can update own profile." on profiles
for update using ((select auth.uid()) = id);
create function public.handle_new_user()
returns trigger as $$
begin
insert into public.roles (name) values (new.raw_user_meta_data ->> 'role');
insert into public.profiles (id, full_name, avatar_url, role_name)
values (new.id, new.raw_user_meta_data ->> 'full_name', new.raw_user_meta_data ->> 'avatar_url', new.raw_user_meta_data ->> 'role');
return new;
end;
$$ language plpgsql;
create trigger on_auth_user_created
after insert on auth.users
for each row
execute procedure public.handle_new_user()
角色已发送到角色表,但身份验证未完成
我尝试了很多,但我不知道解决方案是什么
以下
failure
对象为空
res.fold(
(failure) {
_logger.e(failure.error);
emit(AuthFailure(failure.error));
},
(user) => _emitAuthSuccess(user, emit),
);
}