Preload flutter all the flutter webview pages when app starts

Viewed 137

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;
}
0 Answers
Related