This is my main.dart file, as you can see I have tab view on my homepage where I have implemented 4 webviews - now I want to preload all those webviews when the app starts otherwise it take 1-3 seconds everytime i change the tab to load the new webview.
import 'dart:async';
import 'package:bms_app/main_drawer.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import './home.dart' as firstpage;
import './shop.dart' as secondpage;
import './client.dart' as thirdpage;
import './blog.dart' as fourpage;
import './main_drawer.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:firebase_core/firebase_core.dart';
const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance_channel',
'High Importance Notification',
'This channel is used for important notification',
importance: Importance.high,
playSound: true);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
print('A bg message just showed up: ${message.messageId}');
}
int index = 0;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);
runApp(MaterialApp(home: MyHomePage(title: 'home',),));}
//
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage>
with SingleTickerProviderStateMixin{
late TabController controller;
final Completer<WebViewController> _controller =
Completer<WebViewController>();
@override
void initState(){
super.initState();
controller = new TabController(length: 4, vsync: this);
}
@override
void dispose() {
controller.dispose();
}
@override
Widget build(BuildContext context) {
return
Scaffold(
appBar: new AppBar(
centerTitle: true,
// toolbarHeight: 60,
title: const Text('Build My Site') ,
foregroundColor: Colors.white,
backgroundColor: Colors.redAccent,
actions: <Widget>[
],
),
drawer: MainDrawer(),
bottomNavigationBar: new Material(
color: Colors.redAccent,
child: new TabBar(
controller: controller,
tabs: <Widget>[
new Tab(icon: new Icon(Icons.home)),
new Tab(icon: new Icon(Icons.shopping_bag)),
new Tab(icon: new Icon(Icons.space_dashboard)),
new Tab(icon: new Icon(Icons.book_rounded)),
],
),
),
body: TabBarView(
physics: NeverScrollableScrollPhysics(),
controller: controller,
children: <Widget> [
firstpage.HomePage(),
secondpage.ServicesPage(),
thirdpage.ClientPage(),
fourpage.BlogPage(),
],
),
);
}
}
Here is my homepage dart file also I have 3 more files for other pages with the same code but different URL. I want to load all of them with the main.dart file only, Please help with this
import 'package:bms_app/shop.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import './home.dart' as firstpage;
import './shop.dart' as secondpage;
import './client.dart' as thirdpage;
import './blog.dart' as fourpage;
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin<HomePage> {
// final Completer<WebViewController> _controller =
// Completer<WebViewController>();
late WebViewController _controller;
int position = 1 ;
@override
Widget build(BuildContext context) {
return Scaffold(
body:
Builder(builder: (BuildContext context) {
return Scaffold(
body:
IndexedStack(
index: position,
children: <Widget>[
WebView(
initialUrl: 'https://buildmysite.in',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
},
onProgress: (int progress) {
print("WebView is loading (progress : $progress%)");
_onRemoveHeader(_controller);
},
javascriptChannels: <JavascriptChannel>{
_toasterJavascriptChannel(context),
},
// navigationDelegate: (NavigationRequest request) {
// if (request.url.startsWith('https://buildmysite.in/')) {
// print('blocking navigation to $request}');
// return NavigationDecision.navigate;
// }
// print('allowing navigation to $request');
// return NavigationDecision.prevent;
// },
onPageStarted: (value) {
setState(() {
position = 1;
});
},
onPageFinished: (value) {
setState(() {
position = 0;
});
},
gestureNavigationEnabled: true,
),
Container(
child: Center(
child: CircularProgressIndicator()),
),
]
)
);
}),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.arrow_back),
backgroundColor: Colors.redAccent,
onPressed: () async {
if (await _controller.canGoBack()) {
await _controller.goBack();
} else {
// ignore: deprecated_member_use
Scaffold.of(context).showSnackBar(
const SnackBar(content: Text("No back history item")),
);}
},)
);
}
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
// ignore: deprecated_member_use
Scaffold.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
}
void _onShowUserAgent(WebViewController controller,
BuildContext context) async {
// Send a message with the user agent string to the Toaster JavaScript channel we registered
// with the WebView.
await controller.evaluateJavascript(
'Toaster.postMessage("User Agent: " + navigator.userAgent);');
}
void _onRemoveHeader(WebViewController controller) async {
controller.evaluateJavascript('document.getElementById("site-header").style.display="none";');
controller.evaluateJavascript('document.getElementById("colophon").style.display="none";');
//controller.evaluateJavascript("document.getElementByClass('hamburger-box')[0].style.display='none';");
print('chal raha hai ');
}
Widget _getCookieList(String cookies) {
if (cookies == null || cookies == '""') {
return Container();
}
final List<String> cookieList = cookies.split(';');
final Iterable<Text> cookieWidgets =
cookieList.map((String cookie) => Text(cookie));
return Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: cookieWidgets.toList(),
);
}
@override
bool get wantKeepAlive => true;
}