Flutter: ビルドタイムにアサーションを実行する
August 21, 2024
ビルド時にアサーションしたいケース #
次のような Flutter アプリがあったとします。アプリでは myConstant という定数を使用しています。この定数は将来的に変更される可能性がありますが、その場合であっても 16 文字であるという条件は守られなければいけません。
import 'package:flutter/material.dart';
const String myConstant = "My_16_characters";
void main() {
print(myConstant);
runApp(const MaterialApp());
}
次のように、assert や throw を使って判断する方法もありますが、可能であれば実行時ではなく、ビルドのタイミングでガードしておきたいものです。
import 'package:flutter/material.dart';
const String myConstant = "My_16_characters";
void main() {
assert(myConstant.length == 16, 'myConstant must be 16 characters long.');
if (myConstant.length != 16) {
throw Exception('myConstant must be 16 characters long.');
}
print(myConstant);
runApp(const MaterialApp());
}
実現方法 #
次のようにすることでビルド時にアサーションを実行することができます。
import 'package:flutter/material.dart';
@Assert(myConstant.length == 16, 'myConstant must be 16 characters long.')
const String myConstant = "My_16_characters";
void main() {
runApp(const MaterialApp());
}
class Assert {
const Assert(bool condition, String message) : assert(condition, message);
}
Dart コンパイラはコンパイル時にアノテーションが追加コンストラクタを呼び出す仕組みになっています。この仕組みをうまく利用することで、ビルド時のアサーションを実現しています。
詳細は次の参考記事をご覧ください。
参考 #
- dart - How to assert at build time? - Stack Overflow
- cmc5788/global_assert: A Dart micro-library for asserting at build time.