首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振组8.x认证不更新

颤振组8.x认证不更新
EN

Stack Overflow用户
提问于 2022-07-14 10:01:12
回答 1查看 148关注 0票数 0

我在一个小项目上进行实验和学习,我试图实现一个认证工作流。我已经实现了所有的东西,通过打印我的步骤,一切都应该工作得很好。我想知道为什么我的BlocBuilder不更新。这个项目真的很小,所以我可以为你提供一切方便。由于我的学习集团,我感谢每一个提示,方法和我想要感谢您在此之前。

当应用程序启动时,终端输出:

代码语言:javascript
复制
flutter: building main.dart
flutter: AppLoaded()
flutter: user is NOT signed in
flutter: false
flutter: Transition { currentState: AuthInitial(), event: AppLoaded(), nextState: UnauthenticatedState() }
flutter: block says user is NOT authenticated

这是完全好的,因为im检查在开始时,如果有任何有效的用户数据。现在,当我在我的Login Textbutton中按下home.dart时,我的Blocbuilder应该显示我登录了,但它没有。这是终端输出:

代码语言:javascript
复制
flutter: AppLoaded()
flutter: signed id with credentials: User{id: 1, socketId: 123, userName: Logged in User}
flutter: user is signed in
flutter: true
flutter: currentuser is not empty: User{id: 1, socketId: 123, userName: Logged in User}
flutter: Transition { currentState: AuthInitial(), event: AppLoaded(), nextState: AuthenticatedState() }
flutter: block says user is authenticated

main.dart

代码语言:javascript
复制
import 'package:fl_auth/bloc/auth/auth_bloc.dart';
import 'package:fl_auth/repositories/user_repository.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import 'bloc/bloc_observer.dart';
import 'home.dart';
import 'models/auth.dart';

void main() {
  BlocOverrides.runZoned(
    () {
      runApp(const MyApp());
    },
    blocObserver: SimpleBlocObserver(),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Auth _auth = Auth.instance;
    UserRepository _userRepository = UserRepository(auth: _auth);
    print('building main.dart');

    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BlocProvider(
        create: (context) =>
            AuthBloc(userRepository: _userRepository)..add(AppLoaded()),
        child: Home(),
      ),
    );
  }
}

home.dart

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

import 'bloc/auth/auth_bloc.dart';
import 'models/auth.dart';
import 'repositories/user_repository.dart';

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    Auth _auth = Auth.instance;
    UserRepository _userRepository = UserRepository(auth: _auth);
    AuthBloc authBloc = AuthBloc(userRepository: _userRepository);
    return Scaffold(
        body: SizedBox(
            height: 500,
            child: Column(
              children: [
                Container(
                  height: 200,
                  child: BlocBuilder<AuthBloc, AuthState>(
                      builder: (context, state) {
                    if (state is UnauthenticatedState) {
                      return Center(child: Text('User is unauthenticated'));
                    } else if (state is AuthenticatedState) {
                      return Center(child: Text('YEAH logged in!'));
                    } else {
                      return Center(child: Text('something went wrong'));
                    }
                  }),
                ),
                TextButton(
                    onPressed: () => {
                          authBloc.userRepository.signIn(),
                          authBloc.add(AppLoaded())
                        },
                    child: Text('Login')),
              ],
            )));
  }
}

auth_event.dart

代码语言:javascript
复制
part of 'auth_bloc.dart';

abstract class AuthEvent extends Equatable {
  const AuthEvent();

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

class AppLoaded extends AuthEvent {}

auth_state.dart

代码语言:javascript
复制
// ignore_for_file: public_member_api_docs, sort_constructors_first
part of 'auth_bloc.dart';

abstract class AuthState extends Equatable {
  const AuthState();
  
  @override
  List<Object> get props => [];
}

class AuthInitial extends AuthState {}
class AuthenticatedState extends AuthState {
  User user;
  AuthenticatedState({
    required this.user,
  });
}
class UnauthenticatedState extends AuthState {}

auth.bloc

代码语言:javascript
复制
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:fl_auth/repositories/user_repository.dart';

import '../../models/user.dart';

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

class AuthBloc extends Bloc<AuthEvent, AuthState> {
  UserRepository userRepository;
  AuthBloc({required this.userRepository}) : super(AuthInitial()) {
    on<AppLoaded>((event, emit) async {
      try {
        var isSignedIn = await userRepository.isSignedIn();
        print(isSignedIn);
        if (isSignedIn) {
          var user = await userRepository.getCurrentUser();
          emit(AuthenticatedState(user: user));
          print('block says user is authenticated');
        } else {
          emit(UnauthenticatedState());
          print('block says user is NOT authenticated');
        }
      } catch (e) {
        emit(UnauthenticatedState());
      }
    });
  }
}

user_repository.dart

代码语言:javascript
复制
import 'package:fl_auth/models/user.dart';

import '../models/auth.dart';

class UserRepository {
  Auth auth = Auth.instance;

  UserRepository({required this.auth});

  // sign in with username
  //TODO: change hardcoded username to email and passwort later on
  Future<User> signIn() async {
    try{
      await Future.delayed(Duration(seconds: 1));
      var credentials = User(id: 1, socketId: '123', userName: 'Logged in User');
      print('signed id with credentials: ${auth.currentUser}');
      auth.currentUser = credentials;
      return auth.currentUser;
    }catch(e){
      print(e.toString());
      throw e;
    }
  }

  // check signed in status
  Future<bool> isSignedIn() async {
    try{
      await Future.delayed(const Duration(seconds: 1));
      var currentUser = auth.currentUser;
      if(currentUser.isNotEmpty){
        print('user is signed in');
        return true;
      } else {
        print('user is NOT signed in');
        return false;
      }
    }catch(e){
      print(e.toString());
      throw e;
    }
  }

  // get user
  Future<User> getCurrentUser() async {
    try{
      await Future.delayed(const Duration(seconds: 1));
      var currentUser = auth.currentUser;
      if(currentUser.isNotEmpty){
        print('currentuser is not empty: $currentUser');
        return currentUser;
      } else {
        var message = 'User is empty';
        print('currentuser IS empty: $currentUser');
        throw message;
      }
    }catch(e){
      print(e.toString());
      throw e;
    }
  }
}

auth.dart

代码语言:javascript
复制
import 'user.dart';

class Auth {
  /// private constructor
  Auth._();
  /// the one and only instance of this singleton
  static final instance = Auth._();
  //ChatBloc chatBloc = ChatBloc(DatabaseApi.db);
  
  // Create a User instance. Actually it would be better if this is empty so I can notice if a user is valid or not and can react by checking if the user has values and
  // if not log the user out later on
  User currentUser = User.empty;
}

进口user.dart 'package:equatable/equatable.dart';

代码语言:javascript
复制
/// {@template user}
/// User model
///
/// [User.empty] represents an unauthenticated user.
/// {@endtemplate}
class User extends Equatable {
  /// {@macro user}
  const User({
    required this.id,
    this.socketId,
    this.userName,
  });

  /// The current user's scoket id.
  final String? socketId;

  /// The current user's id.
  final int id;

  /// The current user's name (display name).
  final String? userName;

  /// Empty user which represents an unauthenticated user.
  static const empty = User(id: 0);

  /// Convenience getter to determine whether the current user is empty.
  bool get isEmpty => this == User.empty;

  /// Convenience getter to determine whether the current user is not empty.
  bool get isNotEmpty => this != User.empty;

  @override
  List<Object?> get props => [id, socketId, userName];


  // Convert a user into a Map. The keys must correspond to the names of the
  // columns in the database.
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'socketId': socketId,
      'userName': userName,
    };
  }

   factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'] as int,
      socketId: map['socketId'] as String,
      userName: map['userName'] as String,
    );
  }

  // Implement toString to make it easier to see information about
  // each user when using the print statement.
  @override
  String toString() {
    return 'User{id: $id, socketId: $socketId, userName: $userName}';
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-14 10:50:50

问题在您的OnTap函数中,您可以像这样调用事件。我已经检查过了,它正在按预期工作。

代码语言:javascript
复制
 TextButton(
                    onPressed: () => {
                          authBloc.userRepository.signIn(),
                          context.read<AuthBloc>().add(AppLoaded())
                         
                        },
                    child: const Text('Login')),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72978697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档