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';
import 'package:webview_flutter_android/webview_flutter_android.dart';
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
void main() {
runApp(const TutorMaxLearnApp());
}
class TutorMaxLearnApp extends StatelessWidget {
const TutorMaxLearnApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Tutor Max Learn',
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 _preloadController;
@override
void initState() {
super.initState();
_initializeApp();
}
Future<void> _initializeApp() async {
// Intro video
_videoController = VideoPlayerController.asset('assets/intro.mp4');
await _videoController.initialize();
setState(() {});
_videoController.play();
_videoController.setLooping(false);
// Platform-specific WebViewController params
final PlatformWebViewControllerCreationParams params;
if (WebViewPlatform.instance is WebKitWebViewPlatform) {
params = WebKitWebViewControllerCreationParams(
allowsInlineMediaPlayback: true,
mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
);
} else {
params = const PlatformWebViewControllerCreationParams();
}
final controller = WebViewController.fromPlatformCreationParams(params)
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(Colors.white)
..loadRequest(Uri.parse('https://ictbysathith.cloud/'));
// Android-specific autoplay fix
if (controller.platform is AndroidWebViewController) {
(controller.platform as AndroidWebViewController)
.setMediaPlaybackRequiresUserGesture(false);
}
_preloadController = controller;
// Splash timer -> move to Home
Timer(const Duration(seconds: 3), () async {
final connectivity = await Connectivity().checkConnectivity();
final isOffline = connectivity == ConnectivityResult.none;
if (isOffline) {
_showRestartDialog();
return;
}
Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (_) =>
TutorMaxHomePage(preloadedController: _preloadController),
),
);
});
}
void _showRestartDialog() {
showDialog(
context: context,
barrierDismissible: false,
builder: (_) => AlertDialog(
title: const Text('No Internet'),
content:
const Text('Please connect to the internet and restart the App.'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('Close'),
),
],
),
);
}
@override
void dispose() {
_videoController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: _videoController.value.isInitialized
? SizedBox.expand(
child: FittedBox(
fit: BoxFit.cover,
child: SizedBox(
width: _videoController.value.size.width,
height: _videoController.value.size.height,
child: VideoPlayer(_videoController),
),
),
)
: const Center(child: CircularProgressIndicator()),
);
}
}
class TutorMaxHomePage extends StatefulWidget {
final WebViewController preloadedController;
const TutorMaxHomePage({super.key, required this.preloadedController});
@override
State<TutorMaxHomePage> createState() => _TutorMaxHomePageState();
}
class _TutorMaxHomePageState extends State<TutorMaxHomePage> {
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/offline.png',
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,
)
: WebViewWidget(controller: widget.preloadedController),
),
);
}
}
0 Comments