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.0
  • 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


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.