Flutter地理位置获取插件tldr_get_location的使用

Flutter地理位置获取插件tldr_get_location的使用

简介

TLDR get location 是一个简单的 Flutter 插件,用于获取当前用户的位置,且无需编写大量样板代码。

截图

开始使用

Android 配置

app 模块下的 AndroidManifest.xml 文件中添加以下权限:

<manifest>
    ...
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
</manifest>

iOS 配置

info.plist 文件中添加以下配置:

<dict>
    ...
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>Do you allow this app to know your current location?</string>
    ...
</dict>

初始化插件

首先,确保你的 MainActivity.kt 文件继承自 FlutterFragmentActivity 而不是 FlutterActivity,否则会报错:

//import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.android.FlutterFragmentActivity

class MainActivity: FlutterFragmentActivity() {
}

使用方法

该插件提供了两个方法:requestLocationPermissiongetCurrentLocation

  • requestLocationPermission 用于请求位置权限,并返回 truefalse
  • getCurrentLocation 用于获取当前位置,并返回一个包含 latitudelongitudeTldrLatLng 对象。

初始化插件

final locationPlugin = TldrGetLocation();

请求位置权限

final bool permissionGranted = await locationPlugin.requestLocationPermission();

获取当前位置

TldrLatLng? location = await locationPlugin.getCurrentLocation();
double? latitude = location?.latitude;
double? longitude = location?.longitude;

完整示例

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:tldr_get_location/model.dart';
import 'package:tldr_get_location/tldr_get_location.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('TldrGetLocation 插件示例应用'),
        ),
        body: const LocationWidget(),
      ),
    );
  }
}

class LocationWidget extends StatefulWidget {
  const LocationWidget({super.key});

  [@override](/user/override)
  State<LocationWidget> createState() => _LocationWidgetState();
}

class _LocationWidgetState extends State<LocationWidget> {
  final _tldrGetLocationPlugin = TldrGetLocation();

  String _locationMessage = "尚未获取到位置信息";
  bool? _permissionGranted;

  void _requestLocationPermission() async {
    final bool permissionGranted = await _tldrGetLocationPlugin.requestLocationPermission();
    setState(() {
      _permissionGranted = permissionGranted;
    });
  }

  void _getLocation() async {
    if (_permissionGranted == null || !_permissionGranted!) {
      showErrorDialog(context, "请先请求位置权限");
      return;
    }
    final TldrLatLng? location = await _tldrGetLocationPlugin.getCurrentLocation();
    if (location != null) {
      setState(() {
        _locationMessage = "纬度: ${location.latitude}, 经度: ${location.longitude}";
      });
    } else {
      setState(() {
        _locationMessage = "未能获取到位置信息";
      });
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(_permissionGranted == null
              ? "尚未请求位置权限"
              : _permissionGranted!
              ? "位置权限已授予"
              : "位置权限被拒绝"),
          const SizedBox(height: 20),
          ElevatedButton(
            onPressed: _requestLocationPermission,
            child: const Text('请求位置权限'),
          ),
          const SizedBox(
            height: 20,
          ),
          Text(_locationMessage),
          const SizedBox(height: 20),
          ElevatedButton(
            onPressed: _getLocation,
            child: const Text('获取位置'),
          ),
        ],
      ),
    );
  }
}

void showErrorDialog(BuildContext context, String errorMessage) {
  showDialog(
    context: context,
    builder: (BuildContext context) {
      return AlertDialog(
          title: Text("错误"),
          content: Text(errorMessage),
          actions: [
            Center(
                child: ElevatedButton(
              child: Text("确定"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ))
          ]);
    },
  );
}

更多关于Flutter地理位置获取插件tldr_get_location的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter地理位置获取插件tldr_get_location的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


tldr_get_location 是一个用于在 Flutter 应用中获取设备地理位置的插件。它提供了一种简单的方式来获取设备的当前位置,并且支持持续的位置更新。以下是使用 tldr_get_location 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 tldr_get_location 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  tldr_get_location: ^最新版本

运行 flutter pub get 以安装依赖。

2. 配置权限

在 Android 和 iOS 上,你需要配置相应的权限来获取地理位置。

Android

android/app/src/main/AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

iOS

ios/Runner/Info.plist 文件中添加以下权限:

<key>NSLocationWhenInUseUsageDescription</key>
<string>我们需要您的位置信息来提供更好的服务。</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>我们需要您的位置信息来提供更好的服务。</string>

3. 获取当前位置

在你的 Dart 代码中,导入 tldr_get_location 插件并获取当前位置:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LocationScreen(),
    );
  }
}

class LocationScreen extends StatefulWidget {
  @override
  _LocationScreenState createState() => _LocationScreenState();
}

class _LocationScreenState extends State<LocationScreen> {
  LocationData? _currentLocation;

  Future<void> _getLocation() async {
    try {
      var location = await TldrGetLocation.getLocation();
      setState(() {
        _currentLocation = location;
      });
    } catch (e) {
      print("Error getting location: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('获取地理位置'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (_currentLocation != null)
              Text(
                '纬度: ${_currentLocation!.latitude}\n经度: ${_currentLocation!.longitude}',
                textAlign: TextAlign.center,
              ),
            ElevatedButton(
              onPressed: _getLocation,
              child: Text('获取位置'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 持续位置更新(可选)

如果你需要持续获取位置更新,可以使用 TldrGetLocation.onLocationChanged 监听位置变化:

StreamSubscription<LocationData>? _locationSubscription;

void _startLocationUpdates() {
  _locationSubscription = TldrGetLocation.onLocationChanged.listen((LocationData location) {
    setState(() {
      _currentLocation = location;
    });
  });
}

@override
void dispose() {
  _locationSubscription?.cancel();
  super.dispose();
}

5. 处理权限请求

在某些情况下,你可能需要手动请求位置权限。可以使用 TldrGetLocation.requestPermission() 方法来请求权限:

Future<void> _requestPermission() async {
  await TldrGetLocation.requestPermission();
}
回到顶部