🙂 İNSANLARIN EN HAYIRLISI INSANLARA FAYDALI OLANDIR 🙂

Ramazan HABER / FLUTTER / Webview ileri ve geri button ile ve inappwebview

1-) FLUTTER - Webview ileri ve geri button ile ve inappwebview

 

android için dosya yükleme kaynağı inappwebview : https://pub.dev/packages/flutter_inappwebview/versions/5.0.0-nullsafety.0

dosya indirme vs için : https://www.roketnot.com/not/1581-dio-ile-pdf-indirme-ve-openfile-ile-goruntuleme-download

 

1-) pubspec.yaml

 

 webview_flutter: ^3.0.0

  url_launcher: ^6.0.18

  flutter_inappwebview: ^5.3.2

 

2-) kodlar(ios ise geri ileri buttonu vardır)

 

 

import 'dart:async';

import 'dart:io';

 

import 'package:flutter/material.dart';

import 'package:flutter_easyloading/flutter_easyloading.dart';

import 'package:flutter_inappwebview/flutter_inappwebview.dart';

import 'package:rmosflutterguest/page/ekhizmetler/sitatik_sinif.dart';

import 'package:webview_flutter/webview_flutter.dart' as web;

import 'package:webview_flutter/webview_flutter.dart';

 

 

class HotelBilgileriPage extends StatefulWidget {

  static String routeName = "/HotelBilgileriPage";

 

  const HotelBilgileriPage({Key? key}) : super(key: key);

 

  @override

  _HotelBilgileriPageState createState() => _HotelBilgileriPageState();

}

 

class _HotelBilgileriPageState extends State<HotelBilgileriPage> {

  late InAppWebViewController webViewControllerIn;

 

  Future<bool> _onBackIn() async {

    bool goBack;

    var value = await webViewControllerIn.canGoBack();

    if (value) {

      webViewControllerIn.goBack();

      return false;

    } else {

      exit(0);

    }

  }

 

  Completer<WebViewController> _controller = Completer<WebViewController>();

 

  late WebViewController webViewController;

 

  Future<bool> _onBack() async {

    bool goBack;

    var value = await webViewController.canGoBack();

    if (value) {

      webViewController.goBack();

      return false;

    } else {

      exit(0);

    }

  }

 

  Widget getWebview(){

    if(Platform.isAndroid){

      return WillPopScope(

          onWillPop: _onBackIn,

          child: Scaffold(

            appBar: null,

            body: SafeArea(

              child: Container(

                child: InAppWebView(

                    initialUrlRequest:

                    URLRequest(url: Uri(path: StatikSinif.webSite)),

                    initialOptions: InAppWebViewGroupOptions(

                      crossPlatform: InAppWebViewOptions(

                        mediaPlaybackRequiresUserGesture: false,

                      ),

                    ),

                    onWebViewCreated: (InAppWebViewController controller) {

                      webViewControllerIn = controller;

                    },

                    androidOnPermissionRequest:

                        (InAppWebViewController controller, String origin,

                        List<String> resources) async {

                      return PermissionRequestResponse(

                          resources: resources,

                          action: PermissionRequestResponseAction.GRANT);

                    }),

              ),

            ),

          ));

    }else {

      return WillPopScope(

        onWillPop: _onBack,

        child: Scaffold(

          appBar: AppBar(

            automaticallyImplyLeading: false,

            title: const Text('GUEST X'),

            // This drop down menu demonstrates that Flutter widgets can be shown over the web view.

            actions: <Widget>[

              NavigationControls(_controller.future),

            ],

          ),

          body: SafeArea(

            child: web.WebView(

                navigationDelegate: (NavigationRequest request) {

 

                  return NavigationDecision.navigate;

                },

                initialUrl:"https://"+ StatikSinif.webSite,

                onWebViewCreated: (WebViewController webViewController) {

                  _controller.complete(webViewController);

                  this.webViewController = webViewController;

                },

                javascriptMode: JavascriptMode.unrestricted),

          ),

          // floatingActionButton: _bookmarkButton(),

        ),

      );

    }

 

  }

 

  @override

  void initState() {

    // TODO: implement initState

    super.initState();

 

    if(StatikSinif.webSite==null || StatikSinif.webSite==""){

      EasyLoading.showToast("CRM GenelParam->OtelWeb linkini giriniz...");

    }

  }

 

  @override

  Widget build(BuildContext context) {

    return getWebview();

  }

}

 

 

class NavigationControls extends StatelessWidget {

  const NavigationControls(this._webViewControllerFuture)

      : assert(_webViewControllerFuture != null);

 

  final Future<WebViewController> _webViewControllerFuture;

 

  @override

  Widget build(BuildContext context) {

    return FutureBuilder<WebViewController>(

      future: _webViewControllerFuture,

      builder:

          (BuildContext context, AsyncSnapshot<WebViewController> snapshot) {

        final bool webViewReady =

            snapshot.connectionState == ConnectionState.done;

        final WebViewController? controller = snapshot.data;

        return Row(

          children: <Widget>[

            IconButton(

              icon: const Icon(Icons.arrow_back_ios),

              onPressed: !webViewReady

                  ? null

                  : () => navigate(context, controller!, goBack: true),

            ),

            IconButton(

              icon: const Icon(Icons.arrow_forward_ios),

              onPressed: !webViewReady

                  ? null

                  : () => navigate(context, controller!, goBack: false),

            ),

          ],

        );

      },

    );

  }

 

  navigate(BuildContext context, WebViewController controller,

      {bool goBack: false}) async {

    bool canNavigate =

    goBack ? await controller.canGoBack() : await controller.canGoForward();

    if (canNavigate) {

      goBack ? controller.goBack() : controller.goForward();

    } else {

      /*Scaffold.of(context).showSnackBar(

        SnackBar(

            content: Text("No ${goBack ? 'back' : 'forward'} history item")),

      );*/

    }

  }

}

 

 

 

 

3-) DİĞER

 

onLoadStop: (controller, url) async {
  
pullToRefreshController.endRefreshing();

  
if (url != null) {
    
await updateCookies(url);
  }

  setState(() {
    
this.url = url.toString();
  });
},

 

 

final cookieManager = WebviewCookieManager();
String sessionId="";
String sessionKey="PHPSESSID";
String cookiesString = '';
String url = "";

Future<void> updateCookies(Uri url) async {

  
final gotCookies = await cookieManager.getCookies(url.toString());
  
cookiesString = '';

  
for (var cookie in gotCookies) {
    
cookiesString += '${cookie.name}=${cookie.value};';

    
if(cookie.name=="PHPSESSID"){
      
sessionId=cookie.value;
    }
  }
  print(
"--> "+cookiesString);
}

 

 

 

PATH İÇİN

 

Future<String?> getDownloadPath() async {

    Directory? directory;

    try {

      if (Platform.isIOS) {

        directory = await getApplicationDocumentsDirectory();

    } else {

        directory = Directory('/storage/emulated/0/Download');

        // Put file in global download folder, if for an unknown reason it didn't exist, we fallback

        // ignore: avoid_slow_async_io

        if (!await directory.exists()) directory = await getExternalStorageDirectory();

}

    } catch (err, stack) {

    print("Cannot get download folder path");

}

return directory?.path;

}

 

inappwebview pdf download terminal -> flutter pub add flutter_downloader

 

İNİTİALİZİNG

 

 void callback(String id ,DownloadTaskStatus status,int progress){}

 

Future<void> main() async {
  
WidgetsFlutterBinding.ensureInitialized();
  
await FlutterDownloader.initialize(debug: true, ignoreSsl: true); // , ignoreSsl: true
  
FlutterDownloader.registerCallback(callback);

  runApp(const MyApp());}

 

DOWNLOADİNG

 

onDownloadStart: (
  controller,
  url,
)
async {
  
try {
    
String? dosyaYolu = await getDownloadPath();

    
await FlutterDownloader.enqueue(
        url: url.toString(),
        showNotification:
true,
        openFileFromNotification:
true,
        
// savedDir: (await getExternalStorageDirectory())!.path // getApplicationDocumentsDirectory
        // savedDir: "/storage/emulated/0/Download"
        
savedDir: dosyaYolu.toString());
  }
catch (Ex) {}
},

 

 

inappwebview pullToRefreshController

 

late PullToRefreshController pullToRefreshController;

 

@override
  
void initState() {
// TODO: implement initState
    
super.initState();
    
pullToRefreshController = PullToRefreshController(
      options:
PullToRefreshOptions(
        color:
Colors.blue,
      ),
      onRefresh: ()
async {
        
if (Platform.isAndroid) {
          
webViewControllerIn?.reload();

          
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
              content:
Text("Pagina vernieuwd"),
              duration:
Duration(milliseconds: 300)));
          
pullToRefreshController.endRefreshing();
        }
else if (Platform.isIOS) {
          
webViewControllerIn?.loadUrl(
              urlRequest:
URLRequest(url: await webViewControllerIn?.getUrl()));
          
pullToRefreshController.endRefreshing();
        }
      },
    );
  }

 

 

pullToRefreshController: pullToRefreshController,

 

 

TAM KOD

 

return WillPopScope(
    onWillPop:
_onBackIn,
    child:
Scaffold(
      appBar:
null,
      floatingActionButton:
FloatingActionButton(
        onPressed: () {
          
StatikSinif.urlTemizle().then((value) {
            
Navigator.of(context).pushAndRemoveUntil(
                
MaterialPageRoute(builder: (context) => MyApp()),
                (r) =>
false);
          });
        },
        tooltip:
'Logout',
        child:
Icon(Icons.logout),
      ),
      floatingActionButtonLocation:
          
FloatingActionButtonLocation.startFloat,
      body:
SafeArea(
        child:
Container(
          child:
InAppWebView(
            initialUrlRequest:
                
URLRequest(url: Uri(path: StatikSinif.webSite)),
            initialOptions:
InAppWebViewGroupOptions(
              crossPlatform:
InAppWebViewOptions(
                mediaPlaybackRequiresUserGesture:
false,
                useOnDownloadStart:
true,
                useShouldOverrideUrlLoading:
true,
                javaScriptCanOpenWindowsAutomatically:
true,
                javaScriptEnabled:
true,
                preferredContentMode:
UserPreferredContentMode.MOBILE,
              ),
              android:
AndroidInAppWebViewOptions(
                useShouldInterceptRequest:
true,
                useHybridComposition:
true,
              ),
            ),
            onWebViewCreated: (
InAppWebViewController controller) {
              
webViewControllerIn = controller;
            },
            androidOnPermissionRequest:
                (
InAppWebViewController controller, String origin,
                    
List<String> resources) async {
              
return PermissionRequestResponse(
                resources: resources,
                action:
PermissionRequestResponseAction.GRANT,
              );
            },
            onDownloadStart: (
              controller,
              url,
            )
async {
              
try {
                
String? dosyaYolu = await getDownloadPath();

                
await FlutterDownloader.enqueue(
                    url: url.toString(),
                    showNotification:
true,
                    openFileFromNotification:
true,
                    
// savedDir: (await getExternalStorageDirectory())!.path // getApplicationDocumentsDirectory
                    // savedDir: "/storage/emulated/0/Download"
                    
savedDir: dosyaYolu.toString());
              }
catch (Ex) {}
            },
            pullToRefreshController:
pullToRefreshController,
          ),
        ),
      ),
    ));

 

 

 

5. AndroidManifest.xml

 

<uses-permission android:name="android.permission.INTERNET"/>

<
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<
uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

 

 

 <provider
        
android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
        
android:authorities="${applicationId}.flutter_downloader.provider"
        
android:exported="false"
        
android:grantUriPermissions="true">
        <
meta-data
            
android:name="android.support.FILE_PROVIDER_PATHS"
            
android:resource="@xml/provider_paths"/>
    </
provider>

 

<provider
    
android:name="com.pichillilorenzo.flutter_inappwebview.InAppWebViewFileProvider"
    
android:authorities="${applicationId}.flutter_inappwebview.fileprovider"
    
android:exported="false"
    
android:grantUriPermissions="true">
    <
meta-data
        
android:name="android.support.FILE_PROVIDER_PATHS"
        
android:resource="@xml/provider_paths" />
</
provider>

 


</
application>

 

6. Android->app->src->main->res->xml->provider_paths.xml

 

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <
external-path
        
name="external_files"
        
path="." />
    <
external-files-path
        
name="external_files"
        
path="." />
    <
cache-path
        
name="cache"
        
path="." />
    <
external-cache-path
        
name="external_cache"
        
path="." />
    <
files-path
        
name="files"
        
path="." />


</
paths>

 

 

SON NOT ANDROİD İÇİN BUNU KULLAN savedDir: (await getExternalStorageDirectory())!.path);

İOS İÇİN BUNU KULLAN directory = await getApplicationDocumentsDirectory();

 

 2022 Ekim 22 Cumartesi
 532