main.dart 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import 'dart:convert';
  2. import 'package:firebase_core/firebase_core.dart';
  3. import 'package:firebase_messaging/firebase_messaging.dart';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter_bloc/flutter_bloc.dart';
  6. import 'package:youtube/presentaion/cubit/auth/auth_cubit.dart';
  7. import 'package:youtube/presentaion/cubit/home/home_cubit.dart';
  8. import 'package:youtube/routes.dart';
  9. import 'package:youtube/services/fcm/firebase_notification_handler.dart';
  10. import 'package:youtube/shared/dio_helper.dart';
  11. import 'package:youtube/shared/network/cache_helper.dart';
  12. import 'package:youtube/shared/theme.dart';
  13. import 'shared/bloc_observer.dart';
  14. Future<void> main() async {
  15. WidgetsFlutterBinding.ensureInitialized();
  16. await CacheHelper.init();
  17. await Firebase.initializeApp();
  18. DioHelper.init();
  19. //Handle FCM background
  20. FirebaseMessaging.onBackgroundMessage(_backgroundHandler);
  21. BlocOverrides.runZoned(
  22. () => runApp(MyApp(
  23. appRouter: AppRouter(),
  24. )),
  25. blocObserver: AppBlocObserver());
  26. }
  27. class MyApp extends StatelessWidget {
  28. final AppRouter appRouter;
  29. const MyApp({Key? key, required this.appRouter}) : super(key: key);
  30. @override
  31. Widget build(BuildContext context) {
  32. return MultiBlocProvider(
  33. providers: [
  34. BlocProvider(
  35. create: (_) =>
  36. AuthCubit()..getUserData(uId: CacheHelper.getString(key: 'uId')),
  37. ),
  38. BlocProvider(
  39. create: (_) => HomeCubit()
  40. ..listenToInComingCalls()
  41. ..getUsersRealTime()
  42. ..getCallHistoryRealTime()
  43. ..initFcm(context)
  44. ..updateFcmToken(uId: CacheHelper.getString(key: 'uId')),
  45. ),
  46. ],
  47. child: MaterialApp(
  48. title: 'Firebase agora videochat',
  49. debugShowCheckedModeBanner: false,
  50. theme: appTheme,
  51. onGenerateRoute: appRouter.onGenerateRoute,
  52. ),
  53. );
  54. }
  55. }
  56. Future<void> _backgroundHandler(RemoteMessage message) async {
  57. await Firebase.initializeApp();
  58. await CacheHelper.init();
  59. if (message.data['type'] == 'call') {
  60. Map<String, dynamic> bodyMap = jsonDecode(message.data['body']);
  61. await CacheHelper.saveData(
  62. key: 'terminateIncomingCallData', value: jsonEncode(bodyMap));
  63. }
  64. FirebaseNotifications.showNotification(
  65. title: message.data['title'],
  66. body: message.data['body'],
  67. type: message.data['type']);
  68. }