Flutter虚拟机运行插件runevm_fl的使用

Flutter虚拟机运行插件runevm_fl的使用

runevm_fl

适用于Flutter的RuneVM插件。

示例应用是一个带有语音控制的2048游戏。

开始使用

pubspec.yaml文件中添加RuneVM插件

dependencies:
  flutter:
    sdk: flutter
  runevm_fl: ^0.3.0

加载并运行您的Rune文件

部署

Future<bool> RunevmFl.load(Uint8List runeBytes)

读取manifest

Future<dynamic> RunevmFl.manifest

使用输入字节运行Rune

Future<String> RunevmFl.runRune(Uint8List input)

Rune绑定实现

完整实现见 main.dart

import 'package:runevm_fl/runevm_fl.dart';

class RunMyRune {

  double _input = 0;
  String? _output;

  Future<void> _loadRune() async {
    try {
      // 从资源加载Rune到内存
      ByteData bytes = await rootBundle.load('assets/sine.rune');
      bool loaded =
          await RunevmFl.load(bytes.buffer.asUint8List()) ?? false;
      print("Rune deployed:");
      if (loaded) {
        // 读取带有功能的manifest
        String manifest = (await RunevmFl.manifest).toString();
        print("Manifest loaded: $manifest");
      }
    } on Exception {
      print('Failed to init rune');
    }
    setState(() {
      _loaded = true;
    });
  }

  void _runRune() async {
    try {
      Random rand = Random();
      _input = rand.nextDouble() * 2 * pi;
      // 将输入转换为表示浮点数的4个字节(参见assets/Runefile)
      Uint8List inputBytes = Uint8List(4)
        ..buffer.asByteData().setFloat32(0, _input, Endian.little);
      // 使用输入字节运行Rune
      _output = await RunevmFl.runRune(inputBytes);
      setState(() {});
    } on Exception {
      print('Failed to run rune');
    }
  }

}

锻造部署实现

第一步是初始化锻造并部署模型

import 'package:runevm_fl/runevm_fl.dart';

void loadForge() async {
  final answer = await Forge.forge({
    "deploymentId": "26", // 插入deploymentId
    "apiKey": "{apiKey from forge}", // 插入apiKey
    "baseURL": "https://dev-forge.hotg.ai", // 插入url
    "telemetry": {
      "baseURL": "https://dev-telemetry.hotg.ai", // 插入url
    }
  });
  setState(() {
    _capabilities = answer;
  });
}

运行推理时,只需提供输入到 Forge.predict(Uint8List input)

  void _runInference() async {
    Uint8List inputData = getInputData();
    final data = await Forge.predict([inputData]);
    final out = (data is String) ? json.decode(data) : data;
    doSomethingWithOutput(out);
  }

Android

无需额外配置。

iOS

如果您正在创建一个新应用,首先运行:

flutter run

以生成podfile。

最低iOS版本应至少为12.1以兼容插件:

在XCode > Runner > General > Deployment info中设置此选项。

对于版本<0.3.0,需要禁用Bitcode,要么针对runevm_fl目标:

在XCode > Pods > Targets > runevm_fl > Build Settings > Enable Bitcode > 设置为’No’

或直接在Podfile中添加:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
    ## 添加以下3行到你的podfile
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
    
  end
end

运行它

flutter run

示例代码

// [@dart](/user/dart)=2.9
import 'package:flutter/material.dart';
import 'package:runevm_fl/runevm_fl_web.dart';
import 'dart:async';
import '2048/home_mobile.dart' if (dart.library.js) '2048/home_web.dart';
import 'package:runevm_fl/runevm_fl.dart';

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    print(RunevmFl.getLogs());
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container();
  }
}

更多关于Flutter虚拟机运行插件runevm_fl的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter虚拟机运行插件runevm_fl的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


runevm_fl 是一个用于在 Flutter 应用中运行虚拟机的插件。它允许你在 Flutter 中嵌入一个虚拟机环境,执行特定平台的代码或脚本。这个插件通常用于需要在 Flutter 应用中运行自定义脚本、虚拟机或解释器的场景。

以下是如何在 Flutter 项目中使用 runevm_fl 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 runevm_fl 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  runevm_fl: ^<version>  # 请替换为最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 runevm_fl 插件:

import 'package:runevm_fl/runevm_fl.dart';

3. 初始化虚拟机

在使用虚拟机之前,你需要初始化它。通常可以在 initStatedidChangeDependencies 方法中进行初始化:

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  RuneVM? _runeVM;

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

  Future<void> _initializeRuneVM() async {
    _runeVM = RuneVM();
    await _runeVM!.initialize();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('RuneVM Example'),
        ),
        body: Center(
          child: Text('RuneVM is initialized'),
        ),
      ),
    );
  }
}

4. 运行脚本

在虚拟机初始化之后,你可以运行自定义脚本或代码。例如:

Future<void> _runScript() async {
  if (_runeVM == null) return;

  String script = '''
    function add(a, b) {
      return a + b;
    }
    add(2, 3);
  ''';

  dynamic result = await _runeVM!.runScript(script);
  print('Script result: $result');
}

5. 释放资源

在应用退出或不再需要虚拟机时,记得释放资源:

[@override](/user/override)
void dispose() {
  _runeVM?.dispose();
  super.dispose();
}
回到顶部