welcome_screen.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import 'package:app_flowy/welcome/domain/interface.dart';
  2. import 'package:app_flowy/welcome/domain/auth_state.dart';
  3. import 'package:app_flowy/startup/startup.dart';
  4. import 'package:app_flowy/welcome/application/welcome_bloc.dart';
  5. import 'package:flowy_infra_ui/widget/route/animation.dart';
  6. import 'package:flowy_infra/flowy_logger.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter_bloc/flutter_bloc.dart';
  9. import 'package:flowy_infra/time/prelude.dart';
  10. class WelcomeScreen extends StatelessWidget {
  11. const WelcomeScreen({Key? key}) : super(key: key);
  12. @override
  13. Widget build(BuildContext context) {
  14. return BlocProvider(
  15. create: (context) {
  16. return getIt<WelcomeBloc>()..add(const WelcomeEvent.getUser());
  17. },
  18. child: Scaffold(
  19. body: BlocListener<WelcomeBloc, WelcomeState>(
  20. listener: (context, state) {
  21. state.auth.map(
  22. authenticated: (r) => _handleAuthenticated(context, r),
  23. unauthenticated: (r) => _handleUnauthenticated(context, r),
  24. initial: (r) => {},
  25. );
  26. },
  27. child: const Body(),
  28. ),
  29. ),
  30. );
  31. }
  32. void _pushToScreen(BuildContext context, Widget screen) {
  33. /// Let the splash view sit for a bit. Mainly for aesthetics and to ensure a smooth intro animation.
  34. Navigator.push(
  35. context,
  36. PageRoutes.fade(
  37. () => screen, RouteDurations.slow.inMilliseconds * .001));
  38. }
  39. void _handleAuthenticated(BuildContext context, Authenticated result) {
  40. _pushToScreen(
  41. context, getIt<IWelcomeRoute>().pushHomeScreen(result.userDetail));
  42. }
  43. void _handleUnauthenticated(BuildContext context, Unauthenticated result) {
  44. Log.error(result.error);
  45. _pushToScreen(context, getIt<IWelcomeRoute>().pushSignInScreen());
  46. }
  47. }
  48. class Body extends StatelessWidget {
  49. const Body({Key? key}) : super(key: key);
  50. @override
  51. Widget build(BuildContext context) {
  52. var size = MediaQuery.of(context).size;
  53. return Container(
  54. alignment: Alignment.center,
  55. child: SingleChildScrollView(
  56. child: Stack(
  57. alignment: Alignment.center,
  58. children: [
  59. Image(
  60. fit: BoxFit.cover,
  61. width: size.width,
  62. height: size.height,
  63. image: const AssetImage(
  64. 'assets/images/appflowy_launch_splash.jpg')),
  65. const CircularProgressIndicator.adaptive(),
  66. ],
  67. ),
  68. ),
  69. );
  70. }
  71. }