Flutter: ビルドタイムにアサーションを実行する

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 コンパイラはコンパイル時にアノテーションが追加コンストラクタを呼び出す仕組みになっています。この仕組みをうまく利用することで、ビルド時のアサーションを実現しています。

詳細は次の参考記事をご覧ください。

参考 #