0
    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.

Exalted
  • 15
  • 1
  • 6

1 Answers1

0

Update your android Manifest file by adding the below permission and code in the android folder

<uses-permission android:name="android.permission.WRITE_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>
Rohit Sainik
  • 452
  • 6
  • 15