Has anyone used WebviewAssetLoader in InAppWebview package. I am trying to download my webassets and store it in internal storage using InternalStoragePathHandler. I was able to load the UI but the network calls which is made from the web app inside webview are getting 404 error.But, with same network call if I test it through postman I am getting the response with status code 200. Can anyone help me on this? Please find the output image attached and code below,
// ignore_for_file: prefer_const_declarations
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:archive/archive.dart';
import 'package:hive/hive.dart';
import 'package:http/http.dart' as http;
import 'package:native_app/widgets/drawer.dart';
import 'package:path_provider/path_provider.dart';
import 'dart:io';
class Sample extends StatefulWidget {
const Sample({super.key});
@override
State<Sample> createState() => _SampleState();
}
class _SampleState extends State<Sample> {
CookieManager cookieManager = CookieManager.instance();
ProxyController proxyController = ProxyController.instance();
InAppWebViewController? _controller;
final GlobalKey webViewKey = GlobalKey();
@override
void initState() {
super.initState();
}
InAppWebViewSettings settings = InAppWebViewSettings(
// allowFileAccessFromFileURLs: true,
// allowUniversalAccessFromFileURLs: true,
// allowFileAccess: true,
// allowContentAccess: true,
useShouldInterceptAjaxRequest: false,
useShouldInterceptFetchRequest: false,
useShouldInterceptRequest: false,
webViewAssetLoader: WebViewAssetLoader(
domain: "test.flow.io",
httpAllowed: true,
pathHandlers: [
InternalStoragePathHandler(
directory:
'/data/data/com.example.native_app/app_flutter/',
path: '/',
),
],
),
javaScriptEnabled: true,
// safeBrowsingEnabled: true,
);
Future<void> downloadAndUnzipFile() async {
final url =
'DOWNLOAD_URL';
final response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
final bytes = response.bodyBytes;
// Unzip the file
final archive = ZipDecoder().decodeBytes(bytes);
// Specify the directory where you want to store the unzipped files
final directory = await getApplicationDocumentsDirectory();
// final directory = await getTemporaryDirectory();
//final directory = await getExternalStorageDirectory();
final outputDir =
Directory('${directory?.path}/UIM_19qbevd50qnxvnullC326');
// Directory('${directory.path}');
if (!outputDir.existsSync()) {
outputDir.createSync(recursive: true);
}
var i = 0;
for (final file in archive) {
final fileName = file.name;
final filePath = '${outputDir.path}/$fileName';
if (file.isFile) {
File outFile = File(filePath);
final data = file.content as List<int>;
File(filePath)
..createSync(recursive: true)
..writeAsBytesSync(data);
print('print ${i} ${file.name}');
i++;
if (file.name == 'page/dist/component/index.html') {
// print('print1 ${tempFile.path}/${file.name}');
print('print2 ${outFile.path}');
}
}
}
print('Files unzipped and stored in: ${outputDir.path}');
} else {
throw Exception('Failed to download the file');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Warranty Claim'),
),
drawer: MyDrawer(
email: "[email protected]",
name: "Shri Prakash",
),
body: SafeArea(
child: SingleChildScrollView(
physics: NeverScrollableScrollPhysics(),
child: Column(
children: <Widget>[
Container(
height: MediaQuery.of(context).size.height,
child: InAppWebView(
key: webViewKey,
initialUrlRequest: URLRequest(
url: WebUri("about:blank"),
),
initialSettings: settings,
onWebViewCreated: (controller) async {
_controller = controller;
await downloadAndUnzipFile();
var box = Hive.box('auth');
final cookieValues = {
'accessToken': box.get('accessToken') ?? '',
'tokenType': box.get('tokenType') ?? '',
'issuedAt': box.get('issuedAt') ?? '',
'refreshToken': box.get('refreshToken') ?? '',
};
// set the expiration date for the cookie in milliseconds
final expiresDate = DateTime.now()
.add(Duration(days: 3))
.millisecondsSinceEpoch;
final url = WebUri("https://test.flow.io/");
cookieValues.forEach((name, value) async {
await cookieManager.setCookie(
url: url,
name: name,
value: value.toString(),
expiresDate: expiresDate,
isSecure: true,
);
});
controller.loadUrl(
urlRequest: URLRequest(
url: WebUri(
'https://test.flow.io/UIM_19qbevd50qnxvnullC326/page/dist/component/index.html'),
),
);
},
),
)
],
),
)),
);
}
}