関数、メソッドの引数に Map<String, dynamic>
とか List <dynamic>
とか与えたくなるけど、引数がOptionalの場合、適当に以下のように初期値を与えようとするとnon_constant_default_value
エラーになってしまう(”The default value of an optional parameter must be constant”
とか言われて怒られる)。
void _function ( { Map<String, dynamic> map = {"value1": null} } ){ // hoge }
つまり初期値の {"value1": null}
がconstじゃないから初期化できないよって話らしい。
解決策として、以下のようにMap<String, dynamic>
型のconst
メンバ_nullMap
をクラスに追加して(もしくはdartファイル直下に定数として宣言する)、 _function( {Map<String, dynamic> **map = _nullMap**} ) {/* hoge */ }
と初期値に使用する。
class HogeState extends State<HogeStatePage> { // final のデフォルト値を用意しておけば文句は言われない(正しい対処かどうかは不明) static const Map<String, dynamic> _nullJSON = {"recipe": null}; @override void initState() { super.initState(); // hogehoge } @override Widget build(BuildContext context) { /* hogehoge */ } // const である _nullJSON で初期化 _function( {Map<String, dynamic> json = _nullJSON} ) { /* hogehoge */ } }
const
だけだと Only static fields can be declared as const.Try declaring the field as final, or adding the keyword 'static'.dart[const_instance_field](https://dart.dev/diagnostics/const_instance_field)
とfinal
にするかstatic
をつけろ言われ、final
だとconst
じゃないからダメらしいので、クラス内の場合は static const
しか手がない(クラス外のdartファイル直下だったらconst
だけでも行けそう)。