我在使用 Flutter 中的干净架构注册新用户时遇到问题

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

当我尝试注册新用户时,会出现此消息。我使用 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()


角色已发送到角色表,但身份验证未完成

我尝试了很多,但我不知道解决方案是什么

flutter dart authentication bloc supabase
1个回答
0
投票

以下

failure
对象为空

res.fold(
      (failure) {
        _logger.e(failure.error);
        emit(AuthFailure(failure.error));
      },
      (user) => _emitAuthSuccess(user, emit),
    );
  }
© www.soinside.com 2019 - 2024. All rights reserved.