flutter_degen 0.8.0+2 
flutter_degen: ^0.8.0+2 copied to clipboard
The Flutter code generator for your delegates
Generates reusable chunks of serializable properties that can be assigned to containing classes.
Here are a couple of scenarios where this might be useful:
- A collection of subclasses that share a large number of properties, like FormField widgets, where you want to pass these properties to the constructor, but don't want to have to write all the boilerplate code;
 - A typed routing system, where the route's arguments are also parameters to the widget that's eventually built from them.
 
Start with the base class #
import 'package:flutter_degen_annotations/flutter_degen_annotations.dart';
/// Doesn't have to be abstract
abstract class PersonPageParams {
  final String personId;
  final Person person;
  final bool showHistory;
  
  PersonPageParams({
    @required this.personId, 
    this.person, 
    this.showHistory = false});
}
Create a "subclass" #
In the target class, you need to:
- Add 
part '{file_name}.g.dart' - Create a @delegate property
 - Apply a mixin using the naming convention 
_{baseClassName}Mixin 
part 'person_route_args.g.dart';
/// Route arguments
class PersonRouteArgs extends RouteArgs with _PersonPageParamsMixin {
  
  /// Here is the delegate property
  @delegate(implementDelegate=true)
  final PersonPageParams _params;
  /// This example has another property, for illustration purposes 
  @override
  final uriTemplate = "/person/{personId}";
  
  /// The primary constructor.  This constructor requires an instance of PersonPageParams.
  PersonRouteArgs(this._params);
  /// A flattened constructor.  The args from PersonPageParams will be flattened.  See the `fromUri` 
  /// constructor below 
  PersonRouteArgs.of(@flatten() this._params);
  
  
  /// For illustration purposes, a factory constructor could exist
  factory PersonRouteArgs.fromUri(args) {
    return PersonRouteArgs.of(personId: args["personId"]);
  }
}
Now we can create another subclass #
This time we'll create a widget that takes in the same arguments
/// Person widget
class PersonPage extends StatefulWidget with _PersonPageParamsMixin {
  
  @delegate(implementDelegate=true)
  final PersonPageParams _params;
  PersonPage.ofArgs(this._params, {Key key}): super(key: key);
  
  /// This will flatten out delegate's constructor
  PersonPage(@flatten() this._params, {Key key}): super(key: key);
  
  ... 
}
Run the generator #
# flutter pub run build_runner build