Flutter Lua VM Plugin

Pub package Dartdoc reference

A Flutter plugin provides Lua virtual machine

This plugin is inspired by flutter_lua, a Go based Lua implementation for Flutter.

Getting Started


  • Supports the latest stable vanilla Lua 5.4.1
  • Supports multiple Lua instances (don't be too much. <=100 instances)
  • Each Lua instance runs in a separate thread
  • Lua "print" function outputs to Flutter console & Logging
  • Lua script runs in platform thread
  • Use Java/ObjC to avoid the annoying Swift version compatibility problem

Lua Modules

Modules are loaded when a Lua VM starts. Can be used in Lua code directly.

NameGlobal NameVersion
vmpluginvmpluginPlugin Specific


  • Lua library "os" is NOT supported yet, due to unsupported functions in iOS: system and tmpnam
  • All returned values will be converted to string


Open a new VM

VM instances are named to distinguish each other.

import 'package:luavm/luavm.dart';


await Luavm.open("vm-name");

Run Lua Code

When VM is opened, run Lua code with 'eval' function:

  • To load a Lua function:

await Luavm.eval("name","function luafn(a,b) return a+b end" );
  • To simply run Lua code:
final res = await Luavm.eval("name","return _VERSION")

res should be returned as:

["Lua 5.4"]
  • To call a Lua function:
final res = await Luavm.eval("name","return luafn(1,2)");

Luavm.eval returns a list of String, contains each value returned from Lua function.

final res = await Luavm.eval("name","return 1,2,'hello'");

should return a Dart list:


Close Lua VM

await Luavm.close("name");

Error Handling

Errors will be thrown as LuaError which contains error message as a string.

Lua Module Usage

about require

To use internal Lua modules, no require is needed.

require is now used to import Lua code only, please set package.path properly before require.

This may import local lua file:

package.path = vmplugin.doc_dir.."/?.lua"

local add = require('lib-add')


It is a plugin specific module that provides platform support.

local doc_dir = vmplugin.doc_dir	-- Absolute directory for Application Document 
local platform = vmplugin.platform  -- "ios" or "android"
local temp_dir = vmplugin.temp_dir  -- Absolute directory for Temporary files, corresponding to Temporary Directory of iOS and CacheDir of Android

local res = vmplugin.invoke_method("method-name","method-args")	-- this will invoke a Method Channel call, can be handled by Dart/Other Flutter plugins, currently only support pure string arguments

The invoke_method function can be very useful.

For instance, http get can be archieved this way (together with plugin dio) :

  • In Lua
local jres = vmplugin.invoke_method('httpGet','https://api.myip.com');
  • In Dart
Future<String> httpGet(String url) async {
  final res = await Dio().get<String>(url);
  return res.data;

Luavm.setMethodHandler('httpGet', httpGet);

Please try http-test.lua in example project to see more information.


local cj = cjson.new()
local tbl = {a=1,b=2,c={'a','b','c'}}
local txt = cj.encode(tbl)
local tres = cj.decode(txt)

Besides cjson, cjson_safe is also available to use.


for file in lfs.dir(spath) do
    print ('-',file)

How to contribute

Welcome to create issue about bug, feature request, etc.