Flutter网页视图与定位插件webview_location的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter网页视图与定位插件webview_location的使用

webview_location

这是一个为Flutter设计的包,用于在WebView中通过地名显示Google地图位置,适用于Android和iOS平台。非常适合需要基于位置功能的应用程序,而无需离开应用界面。易于集成且高度可定制,它提供了跨不同操作系统的无缝用户体验。

支持的功能

请参阅示例应用程序以获取详细的实现信息。

功能 Android iOS macOS Web Windows
查看位置 ✔️ ✔️

平台支持

Android iOS macOS Web Linux Windows

使用方法

导入包:

import 'package:webview_location/webview_location.dart';

WebViewLocation小部件添加到您的应用程序,并传递location参数以在WebView中显示位置。location参数是一个表示要在WebView中显示的地名的字符串。

请参阅示例应用程序以获取详细的实现信息。

示例代码

以下是一个完整的示例演示如何使用webview_location插件来显示位置:

import 'package:flutter/material.dart';
import 'package:webview_location/webview_location.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Webview Location Example', // 应用标题
      home: ShowLocation(), // 主页面
    );
  }
}

class ShowLocation extends StatelessWidget {
  const ShowLocation({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Webview Location Example'), // 页面标题
      ),
      body: Center(
          child: ElevatedButton(
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => const ViewLocation(), // 跳转到显示位置的页面
            ),
          );
        },
        child: const Text('Show Location in Webview'), // 按钮文本
      )),
    );
  }
}

class ViewLocation extends StatelessWidget {
  const ViewLocation({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('View Location'), // 页面标题
        ),
        body: const ShowLocationInWebview(
          locationName: 'Yonago, Tottori, Japan', // 地名
        ));
  }
}

更多关于Flutter网页视图与定位插件webview_location的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网页视图与定位插件webview_location的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,如果你想在应用中嵌入一个WebView并获取用户的地理位置信息,可以结合使用webview_flutter插件和geolocator插件。不过,需要注意的是,webview_flutter插件本身并不直接支持获取位置信息,你需要通过JavaScript接口与Flutter进行通信,然后使用geolocator插件获取位置。

以下是一个简单的示例,展示了如何在Flutter中使用webview_fluttergeolocator插件来实现这一功能。

首先,确保在pubspec.yaml文件中添加必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  webview_flutter: ^3.0.4  # 请检查最新版本
  geolocator: ^9.0.2       # 请检查最新版本
  geocoding: ^2.0.0        # 可选,用于将地理坐标转换为地址

然后,运行flutter pub get来安装依赖项。

接下来,创建一个Flutter应用,并在main.dart中实现以下功能:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:geolocator/geolocator.dart';
import 'dart:ui' as ui;
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('WebView with Location'),
        ),
        body: WebViewWithLocation(),
      ),
    );
  }
}

class WebViewWithLocation extends StatefulWidget {
  @override
  _WebViewWithLocationState createState() => _WebViewWithLocationState();
}

class _WebViewWithLocationState extends State<WebViewWithLocation> {
  late WebViewController _controller;

  @override
  Widget build(BuildContext context) {
    return WebView(
      initialUrl: Uri.dataFromString(
        '''
        <!DOCTYPE html>
        <html>
        <head>
          <title>WebView Location</title>
          <script type="text/javascript">
            function getLocationFromFlutter() {
              if (window.FlutterWebViewPlugin) {
                window.FlutterWebViewPlugin.postMessage('getLocation');
              }
            }

            function receiveLocation(data) {
              const location = JSON.parse(data);
              document.getElementById('location').innerText = 
                \`Latitude: ${location.latitude}, Longitude: ${location.longitude}\`;
            }

            window.addEventListener('message', function(event) {
              receiveLocation(event.data);
            });
          </script>
        </head>
        <body>
          <button onclick="getLocationFromFlutter()">Get Location</button>
          <p id="location">Location will appear here</p>
        </body>
        </html>
        ''',
        mimeType: 'text/html',
        encoding: Encoding.getByName('utf-8')
      ).toString(),
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController webViewController) {
        _controller = webViewController;
        _controller.setJavaScriptMessageHandler((message) async {
          // Handle messages from JavaScript
          if (message == 'getLocation') {
            Position position = await _getCurrentLocation();
            if (position != null) {
              Map<String, double> locationData = {
                'latitude': position.latitude,
                'longitude': position.longitude,
              };
              _controller.evaluateJavascript(
                'window.postMessage(JSON.stringify(${jsonEncode(locationData)}));',
              );
            }
          }
        });
      },
    );
  }

  Future<Position?> _getCurrentLocation() async {
    bool serviceEnabled;
    LocationPermission permission;

    // Test if location services are enabled.
    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }
    if (permission == LocationPermission.deniedForever) {
      return Future.error(
          'Location permissions are permanently denied, we cannot request permissions.');
    }

    return await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high,
    );
  }
}

解释

  1. HTML和JavaScript部分:在initialUrl中,我们嵌入了一个简单的HTML页面,其中包含一个按钮,当点击该按钮时,它会调用getLocationFromFlutter函数,该函数通过FlutterWebViewPlugin.postMessage发送一个消息到Flutter。注意,FlutterWebViewPluginwebview_flutter插件在JavaScript中的接口名称,但在实际使用中,你可能需要根据你的WebView实现来调整这部分代码。

  2. Flutter部分:在onWebViewCreated回调中,我们设置了JavaScript消息处理器。当从JavaScript接收到'getLocation'消息时,我们调用_getCurrentLocation函数来获取当前位置,并将位置信息发送回WebView。

  3. 位置获取_getCurrentLocation函数使用geolocator插件来获取当前位置。它首先检查位置服务是否启用,然后请求位置权限,并获取当前位置。

请注意,由于webview_flutter的JavaScript接口可能有所不同,上述代码中的window.FlutterWebViewPlugin.postMessage可能需要根据你的实际情况进行调整。如果webview_flutter插件不支持这种直接的通信方式,你可能需要使用其他方法(如URL Scheme或PostMessage API的替代实现)来实现Flutter与WebView之间的通信。

此外,在实际应用中,请确保处理所有可能的错误情况,例如位置服务不可用、权限被拒绝等,以提供良好的用户体验。

回到顶部