Flutter犯罪管理或记录插件crime的使用

Flutter犯罪管理或记录插件Crime的使用

Crime库

workflow name likes popularity pub points

简介

此软件包用于进行犯罪数据请求。该API允许您从美国和拉丁美洲250多个城市检索犯罪信息。API公开了四个方法来获取原始犯罪数据、犯罪统计数据、犯罪覆盖信息和众包犯罪数据。

它实现了以下知名犯罪数据API提供商的方法:crimeometer.com

它有一个用于测试目的的免费API密钥,可以在上述链接中找到。联系API提供商以获取有关无限请求及其价格的更多信息。

安装

dependencies:
  crime: 0.1.3

示例

查看 example/main.dart

import 'package:crime/crime.dart';

void main() async {
  try {
    const String API_KEY = "XXXXXXXXXXXXXXX"; // 您的私有API密钥。

    final Crime crime = Crime(apiKey: API_KEY);

    final CrimeRawIncidents crimeIncidents = await crime.getCrimeIncidents(
      37.773972,
      -122.431297,
      "50mi",
      DateTime(2021, 1, 1),
      DateTime(2021, 2, 7),
    );

    crimeIncidents.incidents?.forEach((CrimeRawData crimeData) {
      print(
          "犯罪事件 [${crimeData.incidentOffense}] 在 [${crimeData.cityKey}] 发生");
    });
  } catch (e) {
    print(e);
  }
}

方法

构造函数

crime 库类的构造函数,包括一个强制参数以设置 apiKey

Crime({this.apiKey});

获取犯罪覆盖数据

此方法用于从美国的城市以及巴西的圣保罗和里约热内卢、阿根廷的布宜诺斯艾利斯、智利的圣地亚哥、乌拉圭的蒙得维的亚、墨西哥的莱昂等城市的拉丁美洲部分获取犯罪覆盖数据。

Future<List<CrimeCoverage>> getCrimeCoverageData();

获取犯罪事件

此方法用于从特定位置、一定距离范围和一段时间范围内获取犯罪事件数据。

Future<CrimeRawIncidents> getCrimeIncidents(double latitude, double longitude, String distance, DateTime startDateTime, DateTime endDateTime, {int page = 1});

获取犯罪统计

此方法用于从特定位置、一定距离范围和一段时间范围内获取犯罪统计数据。

Future<CrimeStats> getCrimeStats(double latitude, double longitude, String distance, DateTime startDateTime, DateTime endDateTime, {int source = 1});

获取众包犯罪事件

此方法用于从特定位置、一定距离范围和一段时间范围内获取未官方认证的犯罪事件数据。这些信息是通过CityCop应用从社区收集的。

Future<CrimeCrowdIncidents> getCrowdsourcedCrimeIncidents(double latitude, double longitude, String distance, DateTime startDateTime, DateTime endDateTime, {int page = 1});

响应

犯罪覆盖数据

属性 类型 描述
cityName String 城市名称
incidentsQuantity int 事件数量
cityKey String 城市键值
firstIncidentDate DateTime 第一次事件日期
lastIncidentDate DateTime 最后一次事件日期

犯罪原始事件

属性 类型 描述
totalIncidents int 总事件数
totalPages int 请求总页数
incidents List<CrimeRawData> 事件列表

犯罪原始数据

属性 类型 描述
cityKey String 城市代码(UN/LOCODE标准)
incidentCode String 事件代码(来源提供)
incidentDate DateTime 事件发生日期(近似)
incidentOffense String 事件类型(FBI-NIBRS标准)
incidentOffenseCode String 事件代码(FBI-NIBRS标准)
incidentOffenseDescription String 事件子类型(FBI-NIBRS标准)
incidentOffenseDetailDescription String 事件详细描述
incidentOffenseCrimeAgainst String 事件针对对象(人/财产/社会/非犯罪)
incidentOffenseAction String 事件行动状态(已实施/尝试)
incidentSourceOriginalType String 来源原始事件类型
incidentSourceName String 事件来源名称
incidentLatitude double 事件纬度
incidentLongitude double 事件经度
incidentAddress String 事件地址(在某些情况下为近似)

众包犯罪事件

属性 类型 描述
totalIncidents int 总事件数
totalPages int 请求总页数
incidents List<CrimeRawCrowdData> 事件列表

众包原始数据

属性 类型 描述
incidentCode String 事件代码(来源提供)
incidentLatitude double 事件纬度
incidentLongitude double 事件经度

犯罪统计

属性 类型 描述
totalIncidents int 总事件数
reportTypes List<CrimeReportType> 事件类型列表

犯罪报告类型

属性 类型 描述
type String 事件类型描述
count int 事件数量

异常

  • MandatoryApiKeyException: 缺少强制性API密钥。
  • ForbiddenRequestException: 禁止访问资源,API密钥已被停用。
  • LimitExceededRequestException: 在短时间内请求过多。

依赖项

http: ^0.13.1
intl: ^0.17.0

更多关于Flutter犯罪管理或记录插件crime的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter犯罪管理或记录插件crime的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用crime管理或记录插件的示例代码。假设我们有一个名为crime_tracker的Flutter应用,用于记录和管理犯罪事件。为了简单起见,这里不会直接引用一个实际的crime插件(因为Flutter社区可能没有一个具体叫做crime的官方或广泛使用的插件),但我会展示如何模拟一个类似的功能,使用SQLite数据库来存储和管理犯罪记录。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加sqlite_flutter依赖,用于数据库操作:

dependencies:
  flutter:
    sdk: flutter
  sqlite_flutter: ^0.4.4  # 请检查最新版本号

2. 创建数据库帮助类

创建一个新的Dart文件,比如database_helper.dart,用于处理数据库操作:

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

class DatabaseHelper {
  static Database? _db;

  static final DatabaseHelper instance = DatabaseHelper._();

  DatabaseHelper._();

  Future<Database> getDatabase() async {
    if (_db != null) {
      return _db!;
    }
    _db = await openDatabase(
      (await getDatabasesPath())[0] + '/crimes.db',
      onCreate: (db, version) async {
        await db.execute(
          'CREATE TABLE crimes('
          'id INTEGER PRIMARY KEY AUTOINCREMENT,'
          'title TEXT NOT NULL,'
          'date TEXT NOT NULL,'
          'solved INTEGER NOT NULL DEFAULT 0'
          ')',
        );
      },
      version: 1,
    );
    return _db!;
  }

  Future<void> insertCrime(String title, String date, int solved) async {
    final db = await getDatabase();
    await db.insert(
      'crimes',
      {'title': title, 'date': date, 'solved': solved},
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  Future<List<Map<String, dynamic>>> getCrimes() async {
    final db = await getDatabase();
    final result = await db.query('crimes', columns: ['*']);
    return result!.map((row) => (row as Map<String, dynamic>)).toList();
  }

  Future<void> updateCrime(int id, String title, String date, int solved) async {
    final db = await getDatabase();
    await db.update(
      'crimes',
      {'title': title, 'date': date, 'solved': solved},
      where: 'id = ?',
      whereArgs: [id],
    );
  }

  Future<void> deleteCrime(int id) async {
    final db = await getDatabase();
    await db.delete(
      'crimes',
      where: 'id = ?',
      whereArgs: [id],
    );
  }
}

3. 创建犯罪记录页面

在你的lib目录下创建一个新的Dart文件,比如crime_screen.dart,用于显示和管理犯罪记录:

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

class CrimeScreen extends StatefulWidget {
  @override
  _CrimeScreenState createState() => _CrimeScreenState();
}

class _CrimeScreenState extends State<CrimeScreen> {
  late List<Map<String, dynamic>> crimes;
  late TextEditingController titleController;
  late TextEditingController dateController;
  late bool isEditing = false;
  late int crimeIdBeingEdited = -1;

  @override
  void initState() {
    super.initState();
    titleController = TextEditingController();
    dateController = TextEditingController();
    loadCrimes();
  }

  void loadCrimes() async {
    final crimesList = await DatabaseHelper.instance.getCrimes();
    setState(() {
      crimes = crimesList;
    });
  }

  void addOrUpdateCrime() async {
    if (isEditing) {
      await DatabaseHelper.instance.updateCrime(
        crimeIdBeingEdited,
        titleController.text,
        dateController.text,
        0,  // Solved status should be updated based on UI input
      );
    } else {
      await DatabaseHelper.instance.insertCrime(
        titleController.text,
        dateController.text,
        0,  // Solved status should be updated based on UI input
      );
    }
    titleController.clear();
    dateController.clear();
    loadCrimes();
    Navigator.pop(context);
  }

  void deleteCrime(int id) async {
    await DatabaseHelper.instance.deleteCrime(id);
    loadCrimes();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Crime Tracker'),
        actions: [
          IconButton(
            icon: Icon(isEditing ? Icons.save : Icons.add),
            onPressed: () {
              showDialog(
                context: context,
                builder: (context) {
                  return AlertDialog(
                    title: Text(isEditing ? 'Update Crime' : 'Add New Crime'),
                    content: Column(
                      mainAxisSize: MainAxisSize.min,
                      children: [
                        TextField(
                          controller: titleController,
                          decoration: InputDecoration(labelText: 'Title'),
                        ),
                        TextField(
                          controller: dateController,
                          decoration: InputDecoration(labelText: 'Date'),
                        ),
                      ],
                    ),
                    actions: [
                      TextButton(
                        onPressed: () {
                          Navigator.pop(context);
                        },
                        child: Text('Cancel'),
                      ),
                      TextButton(
                        onPressed: addOrUpdateCrime,
                        child: Text('Save'),
                      ),
                    ],
                  );
                },
              );
            },
          ),
        ],
      ),
      body: ListView.builder(
        itemCount: crimes.length,
        itemBuilder: (context, index) {
          return Dismissible(
            key: Key(crimes[index]['id'].toString()),
            onDismissed: (direction) {
              deleteCrime(crimes[index]['id'] as int);
            },
            background: Container(color: Colors.red),
            child: ListTile(
              title: Text(crimes[index]['title'] as String),
              subtitle: Text(crimes[index]['date'] as String),
              trailing: IconButton(
                icon: Icon(Icons.edit),
                onPressed: () {
                  setState(() {
                    isEditing = true;
                    crimeIdBeingEdited = crimes[index]['id'] as int;
                    titleController.text = crimes[index]['title'] as String;
                    dateController.text = crimes[index]['date'] as String;
                  });
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => CrimeScreen()),
                  );
                },
              ),
            ),
          );
        },
      ),
    );
  }
}

4. 在主应用中引入犯罪记录页面

最后,在你的main.dart文件中引入并使用CrimeScreen

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Crime Tracker',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CrimeScreen(),
    );
  }
}

以上代码提供了一个基本的犯罪管理应用框架,使用SQLite数据库来存储犯罪记录,并提供了添加、编辑、删除和显示犯罪记录的功能。请注意,这只是一个示例,实际应用中可能还需要添加更多的功能和优化,比如错误处理、UI美化、表单验证等。

回到顶部