built_value_generator 1.1.3

  • Readme
  • Changelog
  • Installing
  • 47

Built Values for Dart #

Build Status

Introduction #

Built Values provides:

  • Immutable value types;
  • EnumClass, classes that behave like enums;
  • JSON serialization.

Immutable collections are from built_collection.

Articles #

Examples #

For an end to end example see the chat example, which was demoed at the Dart Summit 2016. The data model, used both client and server side, uses value types, enums and serialization from built_value.

Simple examples are here.

Codegen is triggered via either a build.dart to do a one-off build or a watch.dart to continuously watch your source and update generated output.

Value Types #

Value types are, for our purposes, classes that are considered interchangeable if their fields have the same values.

Common examples include Date, Money and Url. Most code introduces its own value types. For example, every web app probably has some version of Account and User.

Value types are very commonly sent by RPC and/or stored for later retrieval.

The problems that led to the creation of the Built Value library have been discussed at great length in the context of AutoValue for Java.

In short: creating and maintaining value types by hand requires a lot of boilerplate. It's boring to write, and if you make a mistake, you very likely create a bug that's hard to track down.

Any solution for value types needs to allow them to participate in object oriented design. Date, for example, is the right place for code that does simple date manipulation.

AutoValue solves the problem for Java with code generation, and Built Values does the same for Dart. The boilerplate is generated for you, leaving you to specify which fields you need and to add code for the behaviour of the class.

Enum Class #

Enum Classes provide classes with enum features.

Enums are very helpful in modelling the real world: whenever there are a small fixed set of options, an enum is a natural choice. For an object oriented design, though, enums need to be classes. Dart falls short here, so Enum Classes provide what's missing!

Design:

  • Constants have name and toString, can be used in switch statements, and are real classes that can hold code and implement interfaces
  • Generated values method that returns all the enum values in a BuiltSet (immutable set)
  • Generated valueOf method that takes a String

Serialization #

Built Values comes with JSON serialization support which allows you to serialize a complete data model of Built Values, Enum Classes and Built Collections. The chat example shows how easy this makes building a full application with Dart on the server and client.

Here are the major features of the serialization support:

It fully supports object oriented design: any object model that you can design can be serialized, including full use of generics and interfaces. Some other libraries require concrete types or do not fully support generics.

It allows different object oriented models over the same data. For example, in a client server application, it's likely that the client and server want different functionality from their data model. So, they are allowed to have different classes that map to the same data. Most other libraries enforce a 1:1 mapping between classes and types on the wire.

It requires well behaved types. They must be immutable, can use interface but not concrete inheritance, must have predictable nullability, hashCode, equals and toString. In fact, they must be Enum Classes, Built Collections or Built Values. Some other libraries allow badly behaved types to be serialized.

It supports changes to the data model. Optional fields can be added or removed, and fields can be switched from optional to required, allowing your data model to evolve without breaking compatbility. Some other libraries break compatability on any change to any serializable class.

It's modular. Each endpoint can choose which classes to know about; for example, you can have multiple clients that each know about only a subset of the classes the server knows. Most other libraries are monolithic, requiring all endpoints to know all types.

It's multi language. Support will be come first for Dart, Java and Java/GWT. Many other libraries support a single language only.

It has first class support for validation via Built Values. An important part of a powerful data model is ensuring it's valid, so classes can make guarantees about what they can do. Other libraries also support validation but usually in a less prominent way.

It's pluggable. You can add serializers for your own types, and you can add plugins which run before and after all serializers. This could be used to interoperate with other tools or to add hand coded high performance serializers for specific classes. Some other libraries are not so extensible.

Features and bugs #

Please file feature requests and bugs at the issue tracker.

Changelog #

1.1.3 #

  • Removed dependency on now-unneeded package:meta.
  • Fixed a few lints/hints in enum generated code.
  • Use comment syntax for generics; using the non-comment syntax requires SDK 1.21 which is not specified in pubspec.yaml.

1.1.2 #

  • Significantly improve build performance by using @memoized instead of precomputed fields.

1.1.1 #

  • Update analyzer and build dependencies.

1.1.0 #

  • Add "built_value_test" library. It provides a matcher which gives good mismatch messages for built_value instances.

1.0.1 #

  • Allow quiver 0.25.

1.0.0 #

  • Version bump to 1.0.0. Three minor features are marked as experimental and may change without a major version increase: BuiltValueToStringHelper, JsonObject and SerializerPlugin.
  • Made toString() output customizable.
  • Made the default toString() output use indentation and omit nulls.
  • Sort serializers in generated output.

0.5.7 #

  • Ignore nulls when deserializing with StandardJsonPlugin.

0.5.6 #

  • Add serializer for "DateTime" fields.
  • Add JsonObject class and serializer.
  • Add convenience methods Seralizers.serializeWith and deserializeWith.
  • Add example for using StandardJsonPlugin.
  • Support serializing NaN, INF and -INF for double and num.

0.5.5 #

  • Add serializer for "num" fields.
  • Better error message for missing serializer.
  • Fix generation when there are nested multi-parameter generics.
  • Use cascades in generated code as suggested by lint.
  • Allow users to define any factory that references the generated implementation.
  • Add example of a simpler factory for a one-field class.

0.5.4 #

  • Enforce that serializer declarations refer to the right generated name.
  • Streamline generation for classes with no fields.
  • Add identical check to generated operator==.
  • Make generated code compatible with strong mode implicit-dynamic:false and implicit-cast:false.

0.5.3 #

  • Add null check to generated builder "replace" methods.
  • Fail with error on abstract enum classes.
  • Update to build 0.7.0 , build_runner 0.3.0, and build_test 0.4.0.

0.5.2 #

  • Support "import ... as" for field types.

0.5.1 #

  • Add @memoized. Annotate getters on built_value classes with @memoized to memoize their result. That means it's computed on first access then stored in the instance.
  • Support generics, in value types and in serialization.
  • Add support for "standard" JSON via StandardJsonPlugin.

0.5.0 #

  • Update dependency on analyzer, build, quiver.
  • Breaking change: your build.dart and watch.dart now need to import build_runner/build_runner.dart instead of build/build.dart.

0.4.3 #

  • Fix builder getters to be available before a set is used.

0.4.2 #

  • Fix lints.
  • Allow "updates" in value type factory to have explicit void return type.

0.4.1 #

  • Fix some analyzer hints.
  • Fix exception from serializer generator if builder field is incorrect.

0.4.0 #

  • Add benchmark for updating deeply nested data structures.
  • Make builders copy lazily. This makes updates to deeply nested structures much faster: only the classes on the path to the update are copied, instead of the entire tree.
  • Breaking change: if you hand-code the builder then you must mark the fields @virtual so they can be overriden in the generated code.
  • Auto-create nested nullable builders when they're accessed. Fixes deserialization with nested nullable builder.

0.3.0 #

  • Merged built_json and built_json_generator into built_value and built_value_generator. These are intended to be used together, and make more sense as a single package.
  • Fix generation when class extends multiple interfaces.
  • Add serialization of BuiltListMultimap and BuiltSetMultimap.

0.2.0 #

  • Merged enum_class and enum_class_generator into built_value and built_value_generator. These are intended to be used together, and make more sense as a single package.

0.1.6 #

  • Add checking for correct type arguments for Built and Builder interfaces.
  • Generate empty constructor with semicolon instead of {}.
  • Use ArgumentError.notNull for null errors.
  • Reject dynamic fields.
  • Add simple benchmark for hashing. Improve hashing performance.

0.1.5 #

  • Allow quiver 0.23.

0.1.4 #

  • Upgrade analyzer, build and source_gen dependencies.

0.1.3 #

  • Generate builder if it's not written by hand.
  • Make toString append commas for improved clarity.
  • Improve examples and tests.
  • Fix double null checking.

0.1.2 #

  • Refactor generator to split into logical classes.

0.1.1 #

  • Improve error output on failure to generate.

0.1.0 #

  • Upgrade to source_gen 0.5.0.
  • Breaking change; see example for required changes to build.dart.

0.0.6 #

  • Move null checks to "build" method for compatibility with Strong Mode analyzer.
  • Allow (and ignore) setters.
  • Allow custom factories on value classes.

0.0.5 #

  • Fix for changes to analyzer library.

0.0.4 #

  • Support @nullable for fields using builders.
  • Fix constraints for source_gen.

0.0.3 #

  • Allow static fields in value class.
  • Allow custom setters in builder.

0.0.2 #

  • Fix error message for missing builder class.
  • Allow non-abstract getters in value class.

0.0.1 #

  • Generator, tests and example.

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  built_value_generator: ^1.1.3

2. Install it

You can install packages from the command line:

with pub:


$ pub get

Alternatively, your editor might support pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


import 'package:built_value_generator/built_value_generator.dart';
  
Popularity:
Describes how popular the package is relative to other packages. [more]
94
Health:
Code health derived from static analysis. [more]
--
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
--
Overall:
Weighted score of the above. [more]
47
Learn more about scoring.

This package version is not analyzed, because it is more than two years old. Check the latest stable version for its analysis.

The package version is not analyzed, because it does not support Dart 2. Until this is resolved, the package will receive a health and maintenance score of 0.

Analysis issues and suggestions

Support Dart 2 in pubspec.yaml.

The SDK constraint in pubspec.yaml doesn't allow the Dart 2.0.0 release. For information about upgrading it to be Dart 2 compatible, please see https://dart.dev/dart-2#migration.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=1.12.0-dev.5.10 <2.0.0