Flutter插件lgcre的使用方法详解
Flutter插件lgcre的使用方法详解
本文将探讨一个名为LGCRE(Local Graph Context-based Recommender Engine)的库,该库在设备上实现了一个兴趣点(POI)推荐引擎。LGCRE旨在为设备所有者提供基于其周围POI和类别的推荐。以下是如何使用此插件的示例。
获取开始
要了解如何使用此插件,请查看示例代码example/lib/main.dart
。
示例代码
import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:lgcre/lgcre.dart';
import 'package:isolate_handler/isolate_handler.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
void useLGCRE(Map<String, dynamic> context) async {
final messenger = HandledIsolate.initialize(context);
messenger.listen((msg) async {
String status;
try {
status = "WAITING";
// LGCRE初始化
Map<String, String> options = {
'lgcre.licenseid': '<license-id>', // 许可证ID
'lgcre.clientid': '<client-id>', // 客户端ID
'lgcre.loglevel': 'fine', // 日志级别
'lgcre.maxmem': '64' // 最大内存
};
await Lgcre.init(options);
// LGCRE重置数据
await Lgcre.reset();
// 添加数据
// 每个数据键(pois, categories, link_categories等)可以为null,如果不需要添加该类型的数据。在这个例子中我们添加了所有类型的数据作为示例
Map<String, dynamic> data = new Map<String, dynamic>();
// 添加POI到推荐器。例如,当知道用户访问了一个POI,并希望通过人与POI之间的链接来表示这一点
data['pois'] = ["poi1", "poi2", "poi3", "poi4"];
// 添加类别到推荐器。例如,因为我们知道用户对某个类别感兴趣或因为用户已访问的POI具有类别
data['categories'] = ["cat1", "cat2", "cat3", "cat4"];
// 添加类别之间的链接到推荐器。例如,当我们知道两个类别相关。这两个类别必须在此之前通过类别字段添加过,无论是这次调用还是之前的addData调用
data['links_categories'] = [
{'category1': 'cat1', 'category2': 'cat2'},
{'category1': 'cat1', 'category2': 'cat3'},
{'category1': 'cat2', 'category2': 'cat4'}
];
// 添加POI和类别之间的链接到推荐器。当我们知道某个POI与某个类别有关时。POI和类别在链接中必须已经通过'pois'和'categories'字段添加过,无论是这次调用还是之前的addData调用
data['links_poi_category'] = [
{'poi': 'poi1', 'category': 'cat1'},
{'poi': 'poi2', 'category': 'cat2'},
{'poi': 'poi3', 'category': 'cat3'}
];
// 添加与用户相关的POI和类别。'pois'是用户感兴趣的POI,例如,因为我们知道他喜欢或访问过这些POI。POI列表必须已经通过'pois'字段添加过,无论是这次调用还是之前的addData调用,类似地对于类别
data['person'] = {
'pois': ['poi1', 'poi2'],
'categories': ['cat1', 'cat2']
};
await Lgcre.addData(data);
// 运行查询
// 要执行查询,构建一个POI和类别列表的映射
Map<String, dynamic> query = new Map<String, dynamic>();
query['pois'] = [
{'poi': 'poi1', 'categories': ['cat1', 'cat2']},
{'poi': 'poi2', 'categories': ['cat1', 'cat3']},
{'poi': 'poi3', 'categories': ['cat2', 'cat4']},
{'poi': 'poi4', 'categories': ['cat3', 'cat4']}
];
// 执行查询
List<ResultEntry>? result = await Lgcre.run(query);
if (result != null) {
StringBuffer strbuilder = new StringBuffer();
strbuilder.write('WORKS:\n');
for (ResultEntry entry in result) {
strbuilder.write(entry.poi + " " + entry.score.toString() + "\n");
}
status = strbuilder.toString();
} else {
status = "RUN QUERY RETURNED NULL";
}
// 移除所有数据,以测试removeData方法
await Lgcre.removeData(data);
// 释放资源
await Lgcre.release();
} on LgcreException catch (e) {
status = '${e}';
} catch (e) {
status = 'Unknown exception thrown';
}
messenger.send(status);
});
}
class _MyAppState extends State<MyApp> {
String _status = 'Unknown';
final isolates = IsolateHandler();
@override
void initState() {
super.initState();
init();
}
Future<void> init() async {
isolates.spawn(useLGCRE,
name: 'useLGCRE',
onReceive: setStatus,
onInitialized: () => isolates.send('Execute', to: 'useLGCRE'));
if (!mounted) return;
}
void setStatus(String status) {
setState(() {
_status = status;
});
isolates.kill('useLGCRE');
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Text(_status),
),
),
);
}
}
Android配置
您需要在您的应用项目中包含proguard规则。在example/android/app/proguard-rules.pro
文件中添加以下配置:
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
或者,您可以从项目中禁用proguard,通过添加以下配置:
buildTypes {
release {
shrinkResources false
minifyEnabled false
useProguard false
}
}
更多关于Flutter插件lgcre的使用方法详解的实战教程也可以访问 https://www.itying.com/category-92-b0.html