В настоящее время установка пользовательских заголовков при отправке запроса на публикацию с методом loadRequest WebViewController не поддерживается на Android. Если вам требуется эта функция, обходной путь — выполнить запрос вручную, а затем вместо этого загрузить данные ответа с помощью loadHtmlString.
Обходной путь, который они предоставляют, поставляется с свои проблемы. Метод loadHtmlString отображает только нестилизованную, не отвечающую страницу в элементе веб-просмотра со следующими ошибками консоли:
Код: Выделить всё
I/chromium(19539): [INFO:CONSOLE(286)] "Uncaught ReferenceError: $ is not defined", source: about:blank (286)
I/chromium(19539): [INFO:CONSOLE(636)] "Uncaught ReferenceError: jQuery is not defined", source: about:blank (636)
Код: Выделить всё
class _PortalWebviewState extends State
{
late final WebViewController controller;
@override
void initState() {
super.initState();
controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted);
_loadRequestWithAuthHeader();
controller.addJavaScriptChannel(
'Flutter',
onMessageReceived: (JavaScriptMessage message) {
print('JavaScript Error: ${message.message}');
},
);
}
Future injectJQuery() async {
await controller.runJavaScript('''
var script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-3.6.0.min.js';
script.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(script);
''');
}
Future _loadRequestWithAuthHeader() async {
const storage = FlutterSecureStorage();
final token = await storage.read(key: 'token');
if (token != null) {
print("Token found in keychain.");
final url = Uri.parse('${Config.domain}/mobile_index.php');
final headers = {
'Authorization': 'Bearer $token',
'Content-Type': 'application/json',
};
try {
final response = await http.post(url, headers: headers);
print('Portal response status code: ${response.statusCode}');
if (response.statusCode == 200) {
await injectJQuery();
await controller.loadHtmlString(response.body);
} else {
print('Error: ${response.statusCode}');
// Handle error cases here
}
} catch (e) {
print('Error: $e');
// Handle exceptions here
}
} else {
print('Token not found');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true,
appBar: AppBar(
title: const Text('COMPANY NAME'),
actions: [
NavigationControls(controller: controller),
// Menu(controller: controller),
],
),
body: PortalWebviewStack(controller: controller),
);
}
Я считаю, что отправка заголовка аутентификации как части запроса GET может быть более простым решением, но мне нравится безопасность POST, и я считаю, что этот обходной путь должен быть возможен в моем случае использования, поскольку на него есть ссылки в документах выше и в эта проблема с Github.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ew-flutter
Мобильная версия