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

回到顶部