Flutter犯罪管理或记录插件crime的使用
Flutter犯罪管理或记录插件Crime的使用
Crime库
简介
此软件包用于进行犯罪数据请求。该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
更多关于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美化、表单验证等。