I am trying to implement a refresh webview on pull down but it isn't working. Im not even getting the "hi refresh" log, and Im not getting any errors when Im logging them.
Idk how or what is missing to enable pull down to refresh in my webview. I tried to remove the gesturedetector but it doesnt make any difference.
On IOS I can at least pull down but nothing happens, on android I cant even pull down.
InAppWebViewController? _webViewController;
String bannerUrl = "";
String? _lastLoadedUrl;
bool _isLoading = true;
PullToRefreshController? _pullToRefreshController;
@override
void initState() {
super.initState();
_pullToRefreshController = PullToRefreshController(
settings: PullToRefreshSettings(
enabled: true,
color: Colors.blue,
backgroundColor: Colors.orange,
),
onRefresh: () async {
debugPrint("hi onrefresh");
setState(() {
_isLoading = true;
});
if (defaultTargetPlatform == TargetPlatform.android) {
debugPrint("hi android");
await _webViewController?.reload();
} else if (defaultTargetPlatform == TargetPlatform.iOS) {
debugPrint("hi ios");
await _webViewController?.loadUrl(
urlRequest: URLRequest(url: await _webViewController?.getUrl()),
);
}
},
);
}
@override
Widget build(BuildContext context) {
super.build(context);
return Consumer<User>(
builder: (context, user, child) {
return Container(
child: SafeArea(
child: Stack(
children: [
!context
? Padding(
padding: const EdgeInsets.fromLTRB(0, 56, 0, 0),
child: GestureDetector(
onLongPress: () {
// Keep empty to prevent long press
},
child: InAppWebView(
keepAlive: InAppWebViewKeepAlive(),
pullToRefreshController: _pullToRefreshController,
initialSettings: InAppWebViewSettings(
useShouldOverrideUrlLoading: true,
isInspectable: kDebugMode,
transparentBackground: true,
javaScriptEnabled: true,
useOnLoadResource: true,
),
onWebViewCreated: (controller) async {
_webViewController = controller;
_addJavaScriptHandlers(controller);
if (widget.baseUrl != null &&
widget.baseUrl!.isNotEmpty) {
final url = widget.baseUrl!;
await controller.loadUrl(
urlRequest: URLRequest(url: WebUri(url)),
);
}
},
onReceivedError: (controller, request, error) { _pullToRefreshController?.endRefreshing();
},
onLoadStart: (controller, url) {
setState(() {
_isLoading = true;
});
},
onLoadStop: (controller, url) {
setState(() {
_isLoading = false;
});
_pullToRefreshController?.endRefreshing();
},
I only needed to add a 1px to get it to work apparently! Posting here if someone has the same question :)
onLoadStop: (controller, url) async {
await injectJavascript(controller);
await Future.delayed(Duration(milliseconds: 300));
await _webViewController?.evaluateJavascript(
source: '''
document.documentElement.style.height = document.documentElement.clientHeight + 1 + 'px';
''',
);