main.dart A2 Perfect code

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:video_player/video_player.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
  runApp(const FatheduApp());
}

class FatheduApp extends StatelessWidget {
  const FatheduApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: SplashScreen(),
    );
  }
}

class SplashScreen extends StatefulWidget {
  const SplashScreen({super.key});

  @override
  State<SplashScreen> createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  late VideoPlayerController _videoController;
  late final WebViewController _webViewController;
  bool _webViewReady = false;

  @override
  void initState() {
    super.initState();

    // Initialize WebView early
    _webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..loadRequest(Uri.parse('https://fathedu.com/dashboard/'))
      ..setNavigationDelegate(
        NavigationDelegate(
          onPageFinished: (_) {
            setState(() {
              _webViewReady = true;
            });
          },
        ),
      );

    // Initialize and play video
    _videoController = VideoPlayerController.asset('assets/intro.mp4')
      ..initialize().then((_) {
        setState(() {});
        _videoController.play();
        _videoController.setLooping(false);

        // Navigate after video ends (or 3 seconds)
        Timer(const Duration(seconds: 3), () {
          Navigator.of(context).pushReplacement(
            MaterialPageRoute(
              builder: (_) => FatheduHomePage(controller: _webViewController),
            ),
          );
        });
      });
  }

  @override
  void dispose() {
    _videoController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _videoController.value.isInitialized
          ? Stack(
              children: [
                SizedBox.expand(
                  child: FittedBox(
                    fit: BoxFit.cover,
                    child: SizedBox(
                      width: _videoController.value.size.width,
                      height: _videoController.value.size.height,
                      child: VideoPlayer(_videoController),
                    ),
                  ),
                ),
                // Optional: show loading spinner for webview init (invisible to user)
                if (!_webViewReady)
                  const Positioned(
                    bottom: 20,
                    left: 0,
                    right: 0,
                    child: Center(
                      child: CircularProgressIndicator(color: Colors.white),
                    ),
                  ),
              ],
            )
          : const Center(child: CircularProgressIndicator()),
    );
  }
}

class FatheduHomePage extends StatefulWidget {
  final WebViewController controller;
  const FatheduHomePage({super.key, required this.controller});

  @override
  State<FatheduHomePage> createState() => _FatheduHomePageState();
}

class _FatheduHomePageState extends State<FatheduHomePage> {
  bool isOffline = false;

  @override
  void initState() {
    super.initState();

    Connectivity().checkConnectivity().then((result) {
      setState(() {
        isOffline = result == ConnectivityResult.none;
      });
    });

    Connectivity().onConnectivityChanged.listen((result) {
      setState(() {
        isOffline = result == ConnectivityResult.none;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: isOffline
            ? Image.asset(
                'assets/images/offline.png',
                fit: BoxFit.cover,
                width: double.infinity,
                height: double.infinity,
              )
            : WebViewWidget(controller: widget.controller),
      ),
    );
  }
}

Post a Comment

0 Comments