Мне нужно было сделать вход в аккаунт для своего приложения, я создал 2 блока из которых один определял глобальное состояние Auth и второй для Авторизации.
Получилось так что при вызове ивента авторизации не менялось состояние Auth блока, но если обновить приложение и попробовать вызвать выход у Auth то состояние менялось и экраны тоже.
В чем может быть проблема?
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:messanger/repositories/repositories.dart';
part 'auth_event.dart';
part 'auth_state.dart';
class AuthBloc extends Bloc<AuthEvent, AuthState> {
final UserRepositories userRepositories = UserRepositories();
AuthBloc() : super(AuthUninitialized()) {
on<AppStarted>((event, emit) async {
final bool hasToken = await userRepositories.hasToken();
if (hasToken) {
emit(AuthAuthenticated());
} else {
emit(AuthUnauthenticated());
}
});
on<LoggedIn>((event, emit) async {
emit(AuthLoading());
print("загрузка");
await userRepositories.addToken(event.token);
emit(AuthAuthenticated());
print("выполнено");
});
on<LoggedOut>((event, emit) async {
emit(AuthLoading());
await userRepositories.deleteToken();
emit(AuthUnauthenticated());
});
}
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:messanger/block/auth/auth_bloc.dart';
import 'package:messanger/block/login/login_bloc.dart';
import 'package:messanger/pages/chat_list_page/chat_list_page.dart';
import 'package:messanger/pages/chatpage/chat_page.dart';
import 'package:messanger/pages/login_page/login_page.dart';
import 'package:messanger/repositories/repositories.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => AuthBloc()..add(AppStarted()),
),
BlocProvider(
create: (context) => LoginBloc(),
)
],
child: const PageScaffoldApp(),
));
}
class PageScaffoldApp extends StatefulWidget {
const PageScaffoldApp({super.key});
@override
State<PageScaffoldApp> createState() => _PageScaffoldAppState();
}
class _PageScaffoldAppState extends State<PageScaffoldApp> {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
systemNavigationBarColor: Colors.transparent,
statusBarColor: Colors.transparent, // Устанавливаем желаемый цвет
));
return CupertinoApp(
debugShowCheckedModeBanner: false,
theme: const CupertinoThemeData(brightness: Brightness.dark),
home: BlocBuilder<AuthBloc, AuthState>(
builder: (context, state) {
if (state is AuthLoading) {
return Container(
child: CircularProgressIndicator(),
);
}
if (state is AuthAuthenticated) {
return ChatListPage();
}
if (state is AuthUninitialized) {
return LoginPage();
}
if (state is AuthUnauthenticated) {
return LoginPage();
} else {
return CupertinoPageScaffold(child: Text("ОШИБКА"));
}
},
));
}
}
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:messanger/block/auth/auth_bloc.dart';
import 'package:messanger/repositories/repositories.dart';
part 'login_event.dart';
part 'login_state.dart';
class LoginBloc extends Bloc<LoginEvent, LoginState> {
final UserRepositories userRepositories = UserRepositories();
final AuthBloc authBloc = AuthBloc();
LoginBloc() : super(LoginInitial()) {
on<LoginButtonPressed>((event, emit) async {
emit(LoginLoading());
try {
final token =
await userRepositories.login(event.nickname, event.password);
authBloc.add(LoggedIn(token: token));
emit(LoginInitial());
} catch (error) {
emit(LoginFailure(error: error.toString()));
}
});
}
}