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,
),
),
),
));
<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();