Flutter网页视图插件fl_webview的使用
Flutter网页视图插件fl_webview的使用
fl_webview
是一个用于在Flutter应用程序中嵌入网页视图的强大插件。它不仅支持加载URL,还提供了丰富的事件监听和自定义设置选项。本文将详细介绍如何使用 fl_webview
插件,并提供完整的示例代码。
iOS WebView本地化配置
在iOS上使用WebView时,如果需要支持多语言,可以在项目的 Info.plist
文件中添加以下键值对:
<key>CFBundleAllowMixedLocalizations</key>
<true/>
这将允许WebView根据设备的语言设置自动切换到相应的本地化资源。
使用 fl_webview
基本用法
以下是一个基本的 FlWebView
示例,展示了如何加载一个URL并处理各种回调事件:
import 'package:flutter/material.dart';
import 'package:fl_webview/fl_webview.dart';
class WebViewExample extends StatefulWidget {
@override
_WebViewExampleState createState() => _WebViewExampleState();
}
class _WebViewExampleState extends State<WebViewExample> {
final String url = 'https://flutter.dev';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('FlWebView Example')),
body: FlWebView(
load: LoadUrlRequest(url),
loadingBar: FlWebLoadingBar(color: Colors.red),
webSettings: WebSettings(),
delegate: FlWebViewDelegate(
onPageStarted: (controller, url) {
print('Page started loading: $url');
},
onPageFinished: (controller, url) {
print('Page finished loading: $url');
},
onProgress: (controller, progress) {
print('Loading progress: $progress%');
},
onSizeChanged: (controller, webViewSize) {
print('WebView size changed: ${webViewSize.frameSize}');
},
onScrollChanged: (controller, webViewSize, offset, positioned) {
print('WebView scroll changed: $offset');
},
onNavigationRequest: (controller, request) {
print('Navigation requested: ${request.url}');
return true;
},
onGeolocationPermissionsShowPrompt: (_, origin) async {
print('Geolocation permission prompt for: $origin');
// Handle location permission here
return await getPermission(Permission.locationWhenInUse);
},
onShowFileChooser: (_, params) async {
print('File chooser parameters: ${params.toMap()}');
// Handle file selection here
FileType fileType = FileType.any;
if (params.acceptTypes.toString().contains('image')) {
fileType = FileType.image;
}
if (params.acceptTypes.toString().contains('video')) {
fileType = FileType.video;
}
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: fileType,
allowMultiple: params.mode == FileChooserMode.openMultiple);
final list = result?.files.where((item) => item.path != null).map((item) => item.path!).toList();
return list ?? [];
},
onUrlChanged: (controller, url) {
print('URL changed to: $url');
},
),
onWebViewCreated: (controller) async {
String userAgentString = 'userAgentString';
final value = await controller.getNavigatorUserAgent();
print('navigator.userAgent: $value');
userAgentString = '$value = $userAgentString';
final userAgent = await controller.setUserAgent(userAgentString);
print('Set userAgent: $userAgent');
},
),
);
}
Future<bool> getPermission(Permission permission) async {
final status = await permission.request();
return status.isGranted;
}
}
自适应高度
为了使WebView的高度自适应内容,可以使用 FlAdaptHeightWevView
组件:
import 'package:flutter/material.dart';
import 'package:fl_webview/fl_webview.dart';
class AdaptHeightWebViewExample extends StatelessWidget {
final String url = 'https://flutter.dev';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Adapt Height WebView Example')),
body: FlAdaptHeightWevView(
maxHeight: 1000,
builder: (onSizeChanged, onScrollChanged, onWebViewCreated) =>
BaseFlWebView(
load: LoadUrlRequest(url),
onWebViewCreated: onWebViewCreated,
delegate: FlWebViewDelegate(
onSizeChanged: onSizeChanged,
onScrollChanged: onScrollChanged,
),
),
),
);
}
}
ScrollView嵌套WebView
当需要在一个可滚动的容器中嵌套WebView时,可以使用 ExtendedFlWebViewWithScrollView
组件:
import 'package:flutter/material.dart';
import 'package:fl_webview/fl_webview.dart';
class ScrollViewWithWebViewExample extends StatelessWidget {
final String url = 'https://flutter.dev';
@override
Widget build(BuildContext context) {
double webHeight = MediaQuery.of(context).size.height -
MediaQuery.of(context).padding.top -
kToolbarHeight;
return Scaffold(
appBar: AppBar(title: Text('ScrollView with WebView Example')),
body: ExtendedFlWebViewWithScrollView(
contentHeight: webHeight,
scrollViewBuilder: (controller, canScroll, webView) {
return CustomScrollView(
controller: controller,
physics: canScroll
? const BouncingScrollPhysics()
: const NeverScrollableScrollPhysics(),
slivers: [
SliverToBoxAdapter(child: webView),
SliverList.builder(
itemBuilder: (context, index) {
return Container(
height: 100,
width: double.infinity,
color: index.isEven ? Colors.lightBlue : Colors.amberAccent,
child: Center(child: Text('Item $index')),
);
},
itemCount: 30,
),
],
);
},
webViewBuilder: (onSizeChanged, onScrollChanged, onWebViewCreated) {
return BaseFlWebView(
load: LoadUrlRequest(url),
delegate: FlWebViewDelegate(
onSizeChanged: onSizeChanged,
onScrollChanged: onScrollChanged,
),
onWebViewCreated: onWebViewCreated,
webSettings: WebSettings(javascriptMode: JavascriptMode.unrestricted),
);
},
),
);
}
}
总结
通过上述示例代码,您可以轻松地在Flutter应用中集成 fl_webview
插件,并实现加载网页、处理回调事件、自适应高度以及在ScrollView中嵌套WebView等功能。希望这些示例能帮助您更好地理解和使用 fl_webview
插件。
更多关于Flutter网页视图插件fl_webview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网页视图插件fl_webview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用fl_webview
插件(现已更名为webview_flutter
)的一个详细示例。这个示例展示了如何嵌入一个简单的WebView并加载一个网页。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加webview_flutter
依赖。
dependencies:
flutter:
sdk: flutter
webview_flutter: ^3.0.4 # 请检查最新版本号
2. 导入包
在你的Dart文件中(例如main.dart
),导入webview_flutter
包。
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
3. 创建WebView页面
创建一个包含WebView的页面。
class WebViewPage extends StatefulWidget {
@override
_WebViewPageState createState() => _WebViewPageState();
}
class _WebViewPageState extends State<WebViewPage> {
late WebViewController _controller;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('WebView Example'),
),
body: WebView(
initialUrl: 'https://flutter.dev', // 这里可以替换为你想要加载的URL
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
},
onPageStarted: (String url) {
print("Page started loading: $url");
},
onPageFinished: (String url) {
print("Page finished loading: $url");
},
gestureNavigationEnabled: true,
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
// 这里你可以调用WebViewController的方法来执行JavaScript或者导航等
await _controller.evaluateJavascript('document.title');
},
tooltip: 'Execute JS',
child: Icon(Icons.code),
),
);
}
}
4. 运行应用
在你的主函数或者主页面路由中引入并使用这个WebViewPage
。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter WebView Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: WebViewPage(),
);
}
}
5. 注意事项
- 确保你已经在Android和iOS项目中添加了必要的权限和配置。对于Android,你可能需要在
AndroidManifest.xml
中添加INTERNET权限。 - 在iOS项目中,确保在
Info.plist
中添加NSAppTransportSecurity
配置以允许HTTP请求(如果你需要加载HTTP页面的话)。
6. 完整项目结构
你的项目结构可能类似于:
your_flutter_app/
├── android/
├── ios/
├── lib/
│ └── main.dart
├── pubspec.yaml
└── README.md
将上述代码分别放入相应的文件中,运行flutter pub get
来安装依赖,然后使用flutter run
来运行你的应用。
这样,你就创建了一个简单的Flutter应用,其中包含一个可以加载网页的WebView。