Flutter Lua脚本执行插件lua_dardo的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter Lua脚本执行插件lua_dardo的使用

插件介绍

LuaDardo 是一个用 Dart 编写的 Lua 虚拟机,实现了 Lua5.3 版本。它兼容大多数 Lua C API,并且支持 Dart 和 Lua 之间的相互调用。

示例代码

import 'package:lua_dardo/lua.dart';

void main(List<String> arguments) {
  LuaState state = LuaState.newState();
  state.openLibs();
  state.loadString(r'''
a=10
while( a &lt; 20 ) do
   print("a value is", a)
   a = a+1
end
''');
  state.call(0, 0);
}

使用说明

  • 加载 Lua 标准库

    LuaState ls = LuaState.newState();
    ls.openLibs();
    ls.loadString("print('hello')");
    ls.call(0, 0);
    
  • 从 Lua 获取变量

    -- test.lua
    a = 100
    b = 120
    
    LuaState ls = LuaState.newState();
    ls.openLibs();
    ls.doFile("test.lua");
    
    // 获取 a 变量
    ls.getGlobal("a");
    if(ls.isNumber(-1)) {
      var a = ls.toNumber(-1);
      print("a=$a");
    }
    
    // 获取 b 变量
    ls.getGlobal("b");
    if(ls.isNumber(-1)) {
      var b = ls.toNumber(-1);
      print("b=$b");
    }
    
  • 获取 Lua 全局表

    -- test.lua
    mytable = {k1 = 1, k2 = 2.34, k3 = "test"}
    
    ls.getGlobal("mytable");
    ls.pushString("k1");
    if(ls.isInteger(-1)) {
      var k1 = ls.toInteger(-1);
    }
    
    // 获取 k2 变量
    ls.pushString("k2");
    ls.getTable(-2);
    if(ls.isNumber(-1)) {
      var k2 = ls.toNumber(-1);
    }
    
  • 通过 getField 方法获取变量

    ls.getGlobal("mytable");
    ls.getField(-1, "k1");
    if(ls.isInteger(-1)) {
      var k1 = ls.toInteger(-1);
    }
    
  • 调用 Lua 函数

    -- test.lua
    function myFunc()
        print("myFunc run")
    end
    
    ls.doFile("test.lua");
    
    ls.getGlobal("myFunc");
    if(ls.isFunction(-1)) {
      ls.pCall(0, 0, 0);
    }
    
  • Lua 调用 Dart

    // Push value onto stack
    ls.pushString("Alex");
    // Set variable name
    ls.setGlobal("name");
    
    -- Get global variable name
    print(name) -- Alex
    
  • 在 Flutter 中使用示例

    function getContent1()
      return Row:new({
          children={
              GestureDetector:new({
                  onTap=function()
                      flutter.debugPrint("--------------onTap--------------")
                  end,
    
                  child=Text:new("click here")}),
              Text:new("label1"),
              Text:new("label2"),
              Text:new("label3"),
          },
          mainAxisAlign=MainAxisAlign.spaceEvenly,
      })
    

end

function getContent2() return Column:new({ children={ Row:new({ children={Text:new(“Hello”),Text:new(“Flutter”)}, mainAxisAlign=MainAxisAlign.spaceAround }), Image:network(‘https://gitee.com/arcticfox1919/ImageHosting/raw/master/img/flutter_lua_test.png’ ,{fit=BoxFit.cover}) }, mainAxisSize=MainAxisSize.min, crossAxisAlign=CrossAxisAlign.center }) end


更多关于Flutter Lua脚本执行插件lua_dardo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Lua脚本执行插件lua_dardo的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用lua_dardo插件来执行Lua脚本的示例代码。lua_dardo是一个允许在Flutter应用中执行Lua脚本的插件。下面是一个基本的示例,展示如何在Flutter中集成和使用lua_dardo

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加lua_dardo依赖:

dependencies:
  flutter:
    sdk: flutter
  lua_dardo: ^最新版本号 # 请替换为实际的最新版本号

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

2. 配置Android和iOS

通常,Flutter插件会自动处理大部分平台配置,但请确保你的android/app/build.gradle文件中的minSdkVersiontargetSdkVersion符合插件要求。对于iOS,通常不需要额外配置。

3. 使用lua_dardo执行Lua脚本

接下来,在你的Flutter应用中,你可以使用lua_dardo来执行Lua脚本。以下是一个简单的示例:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  LuaDardo? _luaDardo;

  @override
  void initState() {
    super.initState();
    _initLuaDardo();
  }

  Future<void> _initLuaDardo() async {
    // 初始化LuaDardo实例
    _luaDardo = LuaDardo();

    // 加载并执行Lua脚本
    await _luaDardo!.loadScriptFromAssets('script.lua');

    // 调用Lua函数并获取结果
    var result = await _luaDardo!.callFunction<String>('helloWorld');
    print('Lua函数返回结果: $result');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter LuaDardo Demo'),
        ),
        body: Center(
          child: Text('正在加载并执行Lua脚本...'),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _luaDardo?.dispose();
    super.dispose();
  }
}

4. 创建Lua脚本

assets文件夹中创建一个名为script.lua的文件,并添加以下Lua代码:

-- script.lua
function helloWorld()
    return "Hello from Lua!"
end

确保在pubspec.yaml文件中声明这个资产文件:

flutter:
  assets:
    - assets/script.lua

5. 运行应用

现在,你可以运行你的Flutter应用。在控制台中,你应该能够看到从Lua脚本返回的"Hello from Lua!"消息。

注意事项

  • 确保你的Lua脚本没有语法错误。
  • 根据需要调整Lua脚本和Flutter代码之间的交互。
  • 始终在不需要时释放LuaDardo实例以避免内存泄漏。

这个示例展示了如何在Flutter中使用lua_dardo插件来加载和执行Lua脚本,并通过调用Lua函数来获取结果。根据具体需求,你可以进一步扩展这个示例。

回到顶部