Flutter插件jawal_flutter的使用方法详解

Flutter插件jawal_flutter的使用方法详解

开始使用Flutter插件jawal_flutter

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  jawal_flutter: ^1.0.3

Android

该插件会在你的 Android 清单文件中添加以下权限:

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

iOS

在你的 Info.plist 文件中添加以下内容:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>YOUR_LOCATION_DESCRIPTION</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>YOUR_LOCATION_DESCRIPTION</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>YOUR_LOCATION_DESCRIPTION</string>

如果你计划在应用处于后台时继续跟踪位置,则需要启用“后台模式”功能并勾选以下两个选项:

  • 位置更新
  • 后台获取

使用

初始化SDK时需要提供API密钥:

JawalConfig config = JawalConfig(
    apiKey: "YOUR_API_KEY",
    userId: "USER_UNIQUE_ID", 
    userDescription: "USER_DESCRIPTION", // 可选
    onInitResult: (InitResultEvent event) {
        if(event.isSuccessful) {
            /// SDK 初始化成功
        } else {
            /// 可以从 event.error 获取错误信息
            print(event.error);
        }
    },
);
Jawal.init(config);
  • USER_UNIQUE_ID: 用户的唯一ID,可以是你数据库中的用户ID。
  • USER_DESCRIPTION: 用户的描述,可以是用户名。

请求位置权限

你需要向用户请求位置权限。SDK 提供了一个方法来请求权限:

PermissionStatus locationStatus = await Jawal.requestLocationPermission();
if(locationStatus.isGranted){
    /// 可选:如果需要在应用后台时继续跟踪位置,请请求后台位置权限
    PermissionStatus backgroundStatus = await Jawal.requestBackgroundLocationPermission();
} else if(locationStatus.isPermanentlyDenied) {
    /// 权限被永久拒绝,你可以提示用户去设置中开启权限
}

开始跟踪

开始位置跟踪:

Jawal.startTracking();

停止跟踪

停止位置跟踪:

Jawal.stopTracking();

监听位置更新

监听位置变化事件:

Jawal.onLocationChange((LocationChangeEvent event) {
    /// 处理位置变化
});

完整示例

以下是一个完整的示例,展示了如何使用 jawal_flutter 插件:

import 'package:flutter/material.dart';
import 'package:jawal_flutter/events/init_result_event.dart';
import 'package:jawal_flutter/events/location_change_event.dart';
import 'package:jawal_flutter/jawal_config.dart';
import 'package:jawal_flutter/models/permission_status.dart';
import 'package:jawal_flutter/jawal.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _initialized = false;
  bool _tracking = false;

  [@override](/user/override)
  void initState() {
    super.initState();
    bootstrap();
  }

  void bootstrap() async {
    initJawalFlutter();
    final PermissionStatus locationStatus = await Jawal.requestLocationPermission();
    if (locationStatus.isGranted) {
      /// 请求后台位置权限(可选)
      /// 如果不需要后台位置,可以跳过这一步
      await Jawal.requestBackgroundLocationPermission();
    } else if (locationStatus.isPermanentlyDenied) {
      /// 提示用户位置权限需要开启,并引导用户到设置页面
    }
  }

  void initJawalFlutter() async {
    JawalConfig config = JawalConfig(
      apiKey: "YOUR_API_KEY",
      userId: "USER_UNIQUE_ID",
      userDescription: "USER_DESCRIPTION", // 可选
      onInitResult: (InitResultEvent event) {
        setState(() {
          _initialized = event.isSuccessful;
        });
      },
    );
    await Jawal.init(config);
    Jawal.onLocationChange((LocationChangeEvent event) {
      /// 处理位置变化
    });

    final isTracking = await Jawal.isTracking();
    setState(() {
      _tracking = isTracking;
    });
  }

  void toggleTracking() async {
    Jawal.isTracking().then((value) => {
          if (value) {
            Jawal.stopTracking()
          } else {
            Jawal.startTracking("YOUR_SESSION_ID")
          }
        });
    setState(() {
      _tracking = !_tracking;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Jawal Flutter Demo App'),
        ),
        body: Center(
            child: Column(
          children: [
            Container(
              margin: const EdgeInsets.only(top: 20),
              child: Text(
                _initialized
                    ? "Jawal Flutter 已初始化"
                    : "Jawal Flutter 未初始化",
                style: const TextStyle(fontSize: 20),
              ),
            ),
            ElevatedButton(
                onPressed: (_initialized) ? toggleTracking : null,
                child: Text(_tracking ? "停止跟踪" : "开始跟踪")),
          ],
        )),
      ),
    );
  }
}

更多关于Flutter插件jawal_flutter的使用方法详解的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部