ImmutableKind<T> class
sealed
Kind for immutable objects.
There are four possible constructors:
- ImmutableKind
- Use if your class has a
const
constructor or it is at least deeply immutable.
- Use if your class has a
- ImmutableKind.walkable
- Use if your class implements Walkable.
- ImmutableKind.withConstructor
- Use if the constructor of your class is not
const
.
- Use if the constructor of your class is not
- ImmutableKind.jsonSerializable
- Use if your class has a
YourClass.fromJson(Map<String, dynamic)
factory and you are too lazy to write a mapper function.
- Use if your class has a
Optimization tricks
- Use Mapper.canReturnSame in your
walk
function. - Specify non-null name. Otherwise
T.toString()
has to be called every time name or jsonName is read.
Example
import 'package:kind/kind.dart';
void main() {
//
// Encode/decode JSON trees:
//
final company = Company.kind.decodeJsonTree({
'name': 'Flutter App Development Experts',
'shareholders': [
{
'@type': 'Person',
'firstName': 'Alice',
'lastName': 'Smith',
},
{
'@type': 'Person',
'firstName': 'Bob',
},
],
});
print("${company.name} has ${company.shareholders.length} shareholders.");
//
// We have `==` and `hashCode` because we extended `HasKind`:
//
print(company.shareholders[1] == Person(firstName: 'Bob')); // --> true
//
// We have `toString()` because we extended `HasKind`:
//
print(company.toString());
// Prints:
// Company(
// "Flutter App Development Experts",
// shareholders: [
// Person(
// firstName: 'John',
// lastName: 'Doe',
// ),
// Person(firstName: 'Bob'),
// ],
// )
}
//
// Example class #1:
// "A static `_walk` function"
//
class Company extends Shareholder {
static const kind = ImmutableKind<Company>(
name: 'Company',
blank: Company(''),
walk: _walk,
);
@override
final String name;
final List<Shareholder> shareholders;
const Company(this.name, {this.shareholders = const []});
@override
Kind<Company> get runtimeKind => kind;
static Company _walk(Mapper f, Company t) {
final name = f.positional(t.name, 'name');
final shareholders = f(
t.shareholders,
'shareholders',
kind: const ListKind(
elementKind: Shareholder.kind,
),
);
// The following is a performance optimization we recommend:
if (f.canReturnSame) {
return t;
}
// Finally, construct a new instance:
return Company(
name,
shareholders: shareholders,
);
}
}
//
// Example #2:
// "A class that extends `Walkable`"
//
class Person extends Shareholder with Walkable {
static const kind = ImmutableKind<Person>.walkable(
name: 'Person',
blank: Person(firstName: ''),
);
/// First name
final String firstName;
/// First name
final String lastName;
const Person({
required this.firstName,
this.lastName = '',
});
@override
String get name => '$firstName $lastName';
@override
Kind<Person> get runtimeKind => kind;
@override
Person walk(Mapper f) {
final firstName = f.required(
this.firstName,
'firstName',
kind: const StringKind.singleLineShort(),
);
final lastName = f(
this.lastName,
'lastName',
kind: const StringKind.singleLineShort(),
);
if (f.canReturnSame) {
return this;
}
return Person(
firstName: firstName,
lastName: lastName,
);
}
}
//
// Example #3:
// "A polymorphic class"
//
abstract class Shareholder extends HasKind {
static const kind = PolymorphicKind<Shareholder>.sealed(
defaultKinds: [
Person.kind,
Company.kind,
],
);
const Shareholder();
String get name;
}
Constructors
-
ImmutableKind({String? name, String? jsonName, required T blank, required WalkFunction<
T> walk, Function? fromJson, Object? toJson(T object)?, Map<String, T> ? constantsByName}) -
Constructs a kind for a class that has a constant constructor.
constfactory
-
ImmutableKind.jsonSerializable({String? name, String? jsonName, Map<
String, Kind> ? kinds, T walk(Mapper f, T t)?, required T fromJson(Map<String, dynamic> json), Map<String, dynamic> toJson(T object)?, Map<String, T> ? constantsByName}) -
Creates a kind for any JSON-serializable class.
factory
-
ImmutableKind.walkable({String? name, String? jsonName, required T blank, Function? fromJson, Object? toJson(T object)?, Map<
String, T> constantsByName}) -
Constructs a kind for a class that implements Walkable.
constfactory
-
ImmutableKind.withConstructor({String? name, String? jsonName, required T constructor(), required WalkFunction<
T> walk, Function? fromJson, Object? toJson(T object)?, Map<String, T> constantsByName}) -
Constructs a kind for a class that has a non-constant constructor.
constfactory
Properties
-
constantsByName
→ Map<
String, T> -
Constant instances.
final
- dartType → Type
-
Type
T
.no setterinherited - defaultValueMirror → InstanceMirror
-
InstanceMirror for the default value.
no setterinherited
- equality → Equality
-
Equality for the kind;
no setterinherited
-
examples
→ Iterable<
T> -
Examples of instances that are valid (isValidDynamic).
no setterinherited
-
examplesThatAreInvalid
→ Iterable<
T> -
Examples of instances that are NOT valid (isValidDynamic).
no setterinherited
-
examplesWithoutValidation
→ Iterable<
T> -
Interesting examples of instances (may be valid or invalid).
no setteroverride
- hashCode → int
-
The hash code for this object.
no setteroverride
- isNullable → bool
-
Whether this kind is nullable.
no setterinherited
- isPrimitive → bool
-
Whether instances of the kind can't have references to other instances.
no setterinherited
- isSealed → bool
-
Whether subclasses are possible;
final
- jsonName → String?
-
JSON identifier of the class.
finalinherited
- name → String
-
Dart identifier of the class.
no setterinherited
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
-
traits
→ List<
Trait> -
Traits of the kind.
finalinherited
Methods
-
asType(
Object? value) → T -
Casts
value
toT
.inherited -
checkDeclaration(
) → void -
Checks that the declaration makes sense.
inherited
-
checkInstance(
Object? value) → void -
inherited
-
checkValid(
T instance) → void -
override
-
checkValidDynamic(
Object? instance) → void -
Throws ArgumentError error if
instance
is not valid (isValidDynamic).inherited -
clone(
T instance) → T -
Clones the instance.
override
-
compare(
T left, T right) → int -
Compares two values.
override
-
debugString(
T instance) → String -
Constructs a string for debugging
instance
.override -
decodeJsonTree(
Object? json) → T -
Converts
json
(any JSON tree) to an instance ofT
.override -
decodeString(
String string) → T -
Decodes
string
to an instance ofT
.inherited -
encodeJsonTree(
T instance) → Object? -
Converts
instance
to a JSON tree.override -
encodeString(
T instance) → String -
Converts
instance
to a string.inherited -
isDefaultValue(
Object? instance) → bool -
Determines whether the argument is a default value of this kind.
inherited
-
isInstance(
Object? instance) → bool -
Determines whether the argument is an instance of
T
.inherited -
isInstanceOfList(
Object? instance) → bool -
Determines whether the argument is an instance of
List<T>
.inherited -
isInstanceOfSet(
Object? instance) → bool -
Determines whether the argument is an instance of
Set<T>
.inherited -
isNullableSubKind(
Kind other, {bool andNotEqual = true}) → bool -
Tells whether the argument is instance of
Kind<T>
and dartType values are different.inherited -
isSubKind(
Kind other, {bool andNotEqual = true}) → bool -
Tells whether the argument is instance of
Kind<T>
and dartType values are different.inherited -
isValid(
T instance) → bool -
Tells whether the instance is valid.
override
-
isValidDynamic(
Object? instance) → bool -
Tells whether the instance is valid.
inherited
-
map(
Mapper mapper, T object) → T -
Maps
object
to a new instance ofT
. -
mapDefault(
Mapper mapper) → T -
Maps the default value with the
mapper
to a new instance ofT
. -
memorySize(
T instance) → int -
Estimates memory usage of
instance
.inherited -
memorySizeWith(
MemoryCounter counter, T instance) → void -
Estimates memory usage with an instance of MemoryCounter.
override
-
newInstance(
) → T -
Constructs a new instance of the default value.
inherited
-
newList(
int length, {bool growable = true}) → List< T> -
Constructs a new list.
inherited
-
newListFrom(
Iterable< T> iterable, {bool growable = true}) → List<T> -
Constructs a new list from
iterable
.inherited -
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
permute(
T instance) → T -
Generates another instance with some deterministic function.
override
-
register(
) → void -
Registers this kind so that it will be visible in Kind.all.
inherited
-
toList(
) → Kind< List< T> > -
Constructs Kind for
List<T>
.inherited -
toNonNullable(
) → Kind< T> -
Returns a non-nullable kind.
inherited
-
toNullable(
) → Kind< T?> -
Constructs Kind for
T?
.inherited -
toPolymorphic(
) → PolymorphicKind< T> -
Constructs a PolymorphicKind for this kind.
inherited
-
toSet(
) → Kind< Set< T> > -
Constructs Kind for
Set<T>
.inherited -
toString(
) → String -
A string representation of this object.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
override