spotube/lib/src/plugin_api/webview/webview_page.dart
Kingkor Roy Tirtho fca0551032 feat: weird impl
2025-12-03 18:25:48 +06:00

63 lines
1.9 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:fk_user_agent/fk_user_agent.dart';
Future<String?> getUserAgent() async {
if (Platform.isIOS || Platform.isAndroid) {
await FkUserAgent.init();
return FkUserAgent.userAgent;
}
return null;
}
final webViewEnvironment = Platform.isWindows
? getApplicationSupportDirectory().then((directory) async {
return await WebViewEnvironment.create(
settings: WebViewEnvironmentSettings(
userDataFolder: join(directory.path, 'inappwebview_data'),
),
);
})
: Future.value(null);
class WebviewPage extends StatelessWidget {
final String uri;
final void Function(String url)? onLoad;
const WebviewPage({super.key, required this.uri, this.onLoad});
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: Future.wait([webViewEnvironment, getUserAgent()]),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
return InAppWebView(
initialUrlRequest: URLRequest(url: WebUri(uri)),
webViewEnvironment: snapshot.data?[0] as WebViewEnvironment?,
initialSettings: InAppWebViewSettings(
userAgent: snapshot.data?[1] as String?,
),
onLoadStop: (controller, url) {
try {
if (onLoad != null && url != null) {
onLoad!(url.toString());
}
} catch (e, stack) {
debugPrint("[Webview][onLoad] Error: $e");
debugPrintStack(stackTrace: stack);
rethrow;
}
},
);
},
);
}
}