Задать вопрос
exeshka
@exeshka
Учусь писать на python

Почему не меняется состояние bloc?

Мне нужно было сделать вход в аккаунт для своего приложения, я создал 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()));
      }
    });
  }
}
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы