import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:connectivity/connectivity.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:double_back_to_close_app/double_back_to_close_app.dart';
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:isolate';
import 'dart:ui';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterDownloader.initialize(
debug: true // optional: set false to disable printing logs to console
);
await Permission.camera.request();
await Permission.storage.request();
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
if (Platform.isAndroid) {
await AndroidInAppWebViewController.setWebContentsDebuggingEnabled(false);
}
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _outputText = "";
ReceivePort _port = ReceivePort();
@override
void initState() {
super.initState();
IsolateNameServer.registerPortWithName(
_port.sendPort, 'downloader_send_port');
_port.listen((dynamic data) {
String id = data[0];
DownloadTaskStatus status = data[1];
int progress = data[2];
setState(() {});
});
FlutterDownloader.registerCallback(downloadCallback);
}
@override
void dispose() {
IsolateNameServer.removePortNameMapping('downloader_send_port');
super.dispose();
}
static void downloadCallback(
String id, DownloadTaskStatus status, int progress) {
final SendPort send =
IsolateNameServer.lookupPortByName('downloader_send_port');
send.send([id, status, progress]);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: DoubleBackToCloseApp(
child: IndexedStack(
index: 0,
children: <Widget>[
InAppWebViewPage(),
Container(
child: Text(_outputText),
)
],
),
snackBar: const SnackBar(
content: Text(
'Double tap back button to exit',
textAlign: TextAlign.center,
),
))));
}
Future<void> initOneSignal() async {
await OneSignal.shared
.init("xxxxxxx-xxxxxxx-xxx", iOSSettings: null);
OneSignal.shared
.setInFocusDisplayType(OSNotificationDisplayType.notification);
OneSignal.shared
.setNotificationReceivedHandler((OSNotification notification) {
this.setState(() {
_outputText =
"Received notification: \n${notification.jsonRepresentation().replaceAll("\\n", "\n")}";
});
});
}
}
class InAppWebViewPage extends StatefulWidget {
@override
_InAppWebViewPageState createState() => new _InAppWebViewPageState();
}
class _InAppWebViewPageState extends State<InAppWebViewPage> {
InAppWebViewController webView;
int _page = 2;
bool _loadError = false;
StreamSubscription<ConnectivityResult> subscription;
@override
initState() {
super.initState();
subscription = Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) {
if (result != ConnectivityResult.none && webView != null) {
print("reload");
_loadError = false;
webView.reload();
}
});
}
@override
dispose() {
super.dispose();
subscription.cancel();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: IndexedStack(
index: _page,
children: <Widget>[
SafeArea(
child: InAppWebView(
initialUrlRequest:
URLRequest(url: Uri.parse("https://google.com")),
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
userAgent: Platform.isIOS
? 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_1_2 like Mac OS X) AppleWebKit/605.1.15' +
' (KHTML, like Gecko) Version/13.0.1 Mobile/15E148 Safari/604.1'
: 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) ' +
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Mobile Safari/537.36',
clearCache: false,
useOnDownloadStart: true,
),
),
onWebViewCreated: (InAppWebViewController controller) {
webView = controller;
},
androidOnPermissionRequest: (InAppWebViewController controller,
String origin, List<String> resources) async {
return PermissionRequestResponse(
resources: resources,
action: PermissionRequestResponseAction.GRANT);
},
onLoadStart: (controller, url) {
setState(() {});
},
onLoadStop: (controller, url) {
print(url);
setState(() {
if (!_loadError) {
_page = 0;
} else {
_page = 1;
}
});
},
onDownloadStart: (controller, url) async {
print("onDownloadStart $url");
final taskId = await FlutterDownloader.enqueue(
url: url.path,
savedDir: (await getExternalStorageDirectory()).path,
showNotification:
true, // show download progress in status bar (for Android)
openFileFromNotification:
true, // click on notification to open downloaded file (for Android)
);
},
onLoadHttpError:
(controller, url, statusCode, description) async {
print("HTTP error $url: $statusCode, $description");
}),
),
(Platform.isAndroid)
? Container(
child: Text("My custom error message"),
)
: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/splash.png'),
fit: BoxFit.fitWidth,
),
)),
Container(
color: Colors.transparent,
decoration: BoxDecoration(
image: DecorationImage(
image: ExactAssetImage('assets/images/splash.png'),
fit: BoxFit.fitWidth,
),
),
),
],
),
);
}
}
I already add the flutter_downloader into my flutter inappwebview, But when i try to download a file using a link inside it, it keep saying fail. Any idea how to fix this?
dependencies:
flutter:
sdk: flutter
flutter_inappwebview: ^5.3.2
connectivity: ^2.0.2
double_back_to_close_app: ^2.0.1
onesignal_flutter: ^2.0.0
permission_handler: ^5.1.0+2
flutter_downloader: ^1.6.1
path_provider: ^2.0.2
I already follow this guy how to download/create pdf through webview in flutter solution, but I get the error that i mention above.