Webview постоянно обновляется - Flutter InAppWebView
Итак, я пытаюсь установить файл cookie (который устанавливает токен пользователя) в Webview, но у меня проблема с тем, что страница постоянно обновляется. вот код:
InAppWebViewController _webViewController;
final expiresDate = DateTime.now().add(Duration(days: 3)).millisecondsSinceEpoch;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: DashboardPageTitlesAtom(
title: widget.title,
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
),
trailing: IconButton(
icon: Icon(CupertinoIcons.refresh),
onPressed: _webViewController == null ? null : () => _webViewController.reload(),
),
),
body: Column(
children: [
Divider(
thickness: 1,
height: 1,
),
Expanded(
child: InAppWebView(
initialOptions: InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
javaScriptEnabled: true,
clearCache: false,
),
),
onWebViewCreated: (InAppWebViewController controller) async {
_webViewController = controller;
},
onLoadStop: (InAppWebViewController controller, url) async {
try {
final token = await getToken();
await _webViewController.evaluateJavascript(
source:
'document.cookie = "accessToken=${token}"; secure=true; httpOnly=false; sameSite=None',
);
await _webViewController.loadUrl(url: widget.url);
} catch (e) {
print(e.toString());
}
}),
),
],
),
);
}
Проблема заключается в том, что единственный способ установить файл cookie - обновить страницу после оценки javascript, и обновление страницы не прекращается. Спасибо.
2 ответа
Вы вызываете метод внутри события. Таким образом вы создаете цикл цикла:
"onLoadStop" -> "loadUrl" -> "onLoadStop" -> "loadUrl" -> "onLoadStop" -> etc.
Когда вызывается, вы загружаете URL-адрес, поэтому
onLoadStop
будет вызван снова для этого нового URL-запроса.
Чтобы добиться того, что вам нужно, вы должны использовать
CookieManager
class и установите cookie при создании WebView (то есть в
onWebViewCreated
мероприятие). Затем вы вызываете
loadUrl
с вашим URL-запросом.
В вашем сценарии у вас будет:
onWebViewCreated: (controller) async {
_webViewController = controller;
try {
// get the access token
final token = await getToken();
// get the CookieManager instance
CookieManager cookieManager = CookieManager.instance();
// set the access token
await cookieManager.setCookie(
url: widget.url,
name: "accessToken",
value: token,
isSecure: true,
isHttpOnly: false,
sameSite: HTTPCookieSameSitePolicy.NONE
);
// then load your initial URL here
await _webViewController.loadUrl(url: widget.url);
} catch (e) {
print(e.toString());
}
},
Попробуйте CookieManager
назовите что-то вроде этого:
CookieManager _cookieManager = CookieManager.instance();
final expiresDate =
DateTime.now().add(Duration(days: 3)).millisecondsSinceEpoch;
`enter code here`_cookieManager.setCookie(
url: "https://flutter.dev/",
name: "session",
value: "54th5hfdcfg34",
domain: ".flutter.dev",
expiresDate: expiresDate,
isSecure: true,
);