Flutterでいい感じのコードジェネレータ探していたらscaffに辿り着いた

by dicekest,

state_notifierに必要なファイル多い問題

今書いているFlutterプロジェクト内でstate_notifierでの実装をメンバーに強制したいが、 state_notifierは初期に必要になるファイルが多いというのと(ページ・コントローラー・ステート最低3ファイルは欲しい) issueに追われているとどうしても過去の実装資産を流用してしまい なかなか実装が浸透しないという現状がある

flutterでコードジェネレータを探してみるとbuild_runner系のものが多く見つかる まぁしかし、だいたいベースとなるdartファイルを作成してそれを元に拡張コードを追加するといったもので ベースとなるdartファイルを作るところが手間なのでサッと作れるようにしたい。

イメージとしてはRailsのScaffold機能やLaravelのartisan make:controllerとか

Scaffとは

カスタムテンプレートファイルからDart/Flutterのファイルを生成することができるコマンドラインツール。 コマンドも打ちやすいのでいいですね

scaff is a simple command-line utility for generating Dart and Flutter components from template files. It is a very tedious job to keep replicating the boilerplate codes every time you try to add a new component in your app. Using scaff, you can generate dart or flutter components from the custom-defined templates. You can even include template variables in the component files and directories name for easy and flexible scaffolding.

Scaffインストール・使い方

$ pub global activate scaff
$ mkdir -p component_templates/state_notifier
$ cd component_templates/state_notifier

state_notifier用のテンプレートとしては以下 {{componentName}}のところは値に置き換えるのかと思って最初間違えたけど{{componentName}}として作成すればOK

component_templates
│   └── state_notifier
│       ├── scaff.setup.json
│       └── {{componentName}}
│           ├── {{componentName}}_page.dart
│           └── {{componentName}}_notifier.dart
│           └── {{componentName}}_state.dart

READMEの順番に必要なディレクトリやファイルを設置していく

$ mkdir {{componentName}}
$ cd {{componentName}}
$ touch {{componentName}}_{page,notifier,state}.dart
$ touch scaff.setup.json

scaff.setup.jsonmappedVariablesをあらかじめ定義して値を埋め込むこともできるが コマンド中に値を渡せた方が使いやすいのでお好みで使えばよさそう

作成する

$ pub global run scaff
Enter source directory (/path/component_templates/state_notifier) »
Enter destination directory (/path/component_templates/state_notifier/__component__) »
Enter template extension (dart) » 
Enter 'componentName' variable value » login
Enter 'className' variable value » Login

^大体こんな感じで聞かれるのでディレクトリやら埋め込む値やらを入力してやるとあとはコードが出力される 不満としてはcomponentNameとかclassNameを入れなくてもファイル名とかから値を埋め込んで欲しいのと ファイルの出力先が1箇所になってしまうので生成した後に移動する手間があること、あとfreezedファイルを生成したりとか

そして、これは利用する側の問題だがdartfmt, flutter analyzeなどの対象ディレクトリをちゃんと指定していないと component_templatesを対象としてしまいエラーをめちゃくちゃ吐くので設定を見直す必要がある

今回使ったテンプレートサンプルはこちら

https://github.com/rydein/scaff_template