Skip to main content

flat_buffers_generator 1.0.1 copy "flat_buffers_generator: ^1.0.1" to clipboard
flat_buffers_generator: ^1.0.1 copied to clipboard

A build_runner builder for generating Dart code from FlatBuffers schema (.fbs) files using flatc.

flat_buffers_generator #

A Dart build_runner code generator that compiles FlatBuffers schema (.fbs) files into Dart code (.g.dart) using the official FlatBuffers compiler (flatc).

Features #

  • Automated Generation: Generates Dart classes from .fbs schemas using standard Dart build tooling (dart run build_runner build).
  • Flexible File Placement: Defaults to compiling files from schemas/ into lib/schemas/, fully customizable via build.yaml.
  • Custom Compiler Flags: Pass additional compiler arguments (e.g. --gen-mutable) directly to flatc.
  • Clear Error Reporting: Descriptive error messages with compiler output when compilation fails or flatc is not installed.

Prerequisites #

The FlatBuffers compiler (flatc) must be installed on your machine and available in your PATH (or configured via flatc_path in build.yaml).

Installing flatc #

  • macOS (Homebrew):
    brew install flatbuffers
    
  • Ubuntu / Debian:
    sudo apt-get install flatbuffers-compiler
    
  • Windows (Chocolatey / Scoop):
    choco install flatc
    # or
    scoop install flatbuffers
    
  • Manual: Download precompiled binaries from the FlatBuffers GitHub Releases.

Getting Started #

Add flat_buffers_generator and build_runner to your pubspec.yaml:

dependencies:
  flat_buffers: ^25.9.23 # same major version as your flatc

dev_dependencies:
  build_runner: ^2.4.0
  flat_buffers_generator: ^1.0.0

The generated code targets the flat_buffers runtime of the same major version as the flatc that produced it (check with flatc --version), so keep the two in sync.

Then tell build_runner to read your schemas. schemas/ is not one of build_runner's default source directories, so without this the builder never runs. Add a build.yaml next to your pubspec.yaml:

additional_public_assets:
  - "schemas/**"

additional_public_assets is added to the default sources, so other builders (lib/, test/, bin/, web/, …) keep working. If schemas/ holds .fbs files that aren't build sources, the build prints a warning pointing to this setting instead of silently generating nothing.

Avoid a partial sources list. targets.$default.sources replaces the default list. Something like sources: ["schemas/**", "lib/**", "$package$"] quietly drops test/**, bin/**, web/**, pubspec.yaml, … so builders such as mockito or build_web_compilers stop seeing their inputs. If you really need sources, list the defaults too:

targets:
  $default:
    sources:
      - "schemas/**"
      - "assets/**"
      - "benchmark/**"
      - "bin/**"
      - "CHANGELOG*"
      - "example/**"
      - "lib/**"
      - "test/**"
      - "integration_test/**"
      - "tool/**"
      - "web/**"
      - "node/**"
      - "LICENSE*"
      - "pubspec.yaml"
      - "pubspec.lock"
      - "README*"
      - "$package$"

Usage #

1. Define your FlatBuffers schema #

Create a .fbs schema file in the schemas/ directory (e.g. schemas/monster.fbs):

include "common/vec3.fbs";

namespace MyGame.Sample;

enum Color:byte { Red = 0, Green, Blue = 2 }

table Monster {
  pos:MyGame.Common.Vec3;
  mana:short = 150;
  hp:short = 100;
  name:string;
  friendly:bool = false;
  inventory:[ubyte];
  color:Color = Blue;
}

root_type Monster;

with the shared struct in schemas/common/vec3.fbs:

namespace MyGame.Common;

struct Vec3 {
  x:float;
  y:float;
  z:float;
}

2. Run the builder #

Run the build runner in your project:

dart run build_runner build

Each schema gets its own Dart file: lib/schemas/monster.g.dart and lib/schemas/common/vec3.g.dart. The directory layout under schemas/ is kept.

For active development, watch for file changes automatically:

dart run build_runner watch

Included schemas are tracked as dependencies, so editing common/vec3.fbs also regenerates monster.g.dart.

See example/ for a complete package.

Schema rules and limitations #

  • Includes are resolved the way flatc resolves them: relative to the including file, then relative to input_dir, then relative to the package root. Included files must be under input_dir: each one gets its own .g.dart, and the imports flatc writes are rewritten to point to it.

  • One namespace per file. flatc writes one Dart file per namespace, which doesn't fit the one-schema → one-.g.dart model, so a schema declaring several namespaces is reported as an error. Move each namespace into its own file and use include.

  • Include-only schemas become barrels. A schema that declares no types and only includes others (e.g. a main.fbs listing all your schemas) generates a .g.dart that exports the outputs of its direct includes:

    // lib/schemas/main.g.dart
    export 'pe/pe.g.dart';
    export 'pe/pe_x32.g.dart';
    export 'pe/pe_x64.g.dart';
    

    Dart puts every exported name in one namespace, so if two exported schemas declare the same type name (even in different FlatBuffers namespaces), the barrel fails to compile with ambiguous_export. Rename one of the types, or import the individual .g.dart files instead of the barrel.

  • Included schemas need distinct file names (e.g. not both a/types.fbs and b/types.fbs in the same schema), because flatc imports them by file name only.

  • Output names: outputs use the .g.dart extension, like source_gen builders. Don't keep a hand-written lib/schemas/x.dart that also uses a source_gen builder (part 'x.g.dart';), since both builders would claim lib/schemas/x.g.dart.

  • Unsupported extra_args: -o, -I, --gen-all, --filename-suffix, --filename-ext and non-Dart generators (--cpp, --java, --ts, -b, …) conflict with how the builder runs flatc and are rejected when the build starts.

Configuration #

You can customize the input directory, output directory, compiler path, and extra arguments in your project's build.yaml:

additional_public_assets:
  - "schemas/**"

targets:
  $default:
    builders:
      flat_buffers_generator:flatc_builder:
        options:
          input_dir: 'schemas'
          output_dir: 'lib/schemas'
          flatc_path: 'flatc'
          extra_args:
            - '--gen-mutable'

Custom Directory Example #

To use a custom directory such as custom_schemas/ and output to lib/models/:

additional_public_assets:
  - "custom_schemas/**"

targets:
  $default:
    builders:
      flat_buffers_generator:flatc_builder:
        options:
          input_dir: 'custom_schemas'
          output_dir: 'lib/models'

A directory already in the default sources (e.g. lib/fbs/) doesn't need additional_public_assets.

Configuration Options #

Option Type Default Description
input_dir String 'schemas' Directory containing input .fbs schema files.
output_dir String 'lib/schemas' Directory where generated .g.dart files will be written. Must differ from input_dir.
flatc_path String 'flatc' Path or command name for the flatc binary.
extra_args List<String> [] Additional command-line flags to pass to flatc (see limitations).
1
likes
160
points
360
downloads

Documentation

API reference

Publisher

verified publisherlouispoirier.io

Weekly Downloads

A build_runner builder for generating Dart code from FlatBuffers schema (.fbs) files using flatc.

Repository (GitHub)
View/report issues

License

MIT (license)

Dependencies

build, glob, path

More

Packages that depend on flat_buffers_generator