リリースしたら動かない!
flutter開発で
そんな時
1つの可能性として
コンパイラーが勝手に
必要なソースコードを削除している可能性があります。
なので
動かない箇所のメソッドやクラスの直前に
- @pragma(‘vm:entry-point’)
をつけてみてください。
私はこれで解決しました。
プログラムの例
1つ事例を紹介します
音楽再生させるプログラムを作成しており、
デバッグの時は鳴ったのですが、リリースしたら鳴らなくなりました。
なので、音楽再生のメソッドの直前に
@pragma(‘vm:entry-point’)
の行を追記したら
音楽再生されるようになりました。
ソース
@pragma('vm:entry-point') //↓音楽再生用のメソッド
static Future callSoundStart() async {
String? strSePath;
strSePath = await _loadStrSetting('mpath');
_player = AudioPlayer();
await _player.setLoopMode(LoopMode.all);
if(strSePath != null && strSePath != "") {
await _player.setFilePath(strSePath);
}else{
await _player.setAsset('assets/alarm.mp3');
}
await _player.play();
}
当たり前なのかもしれませんが、本格的にリリースする前にリリースモードで試してみてください。
って人は以下の記事を参考にしてください。
みんプロさんの記事、非常にわかりやすいです。
@pragma(‘vm:entry-point’)とは?
という勉強熱心な方もいると思います。
調べたところDart公式のGitHubサイトに説明がありました。
Dartのコンパイラーに関わってくるので
すべてを理解できませんでしたが
以下のように解釈しました。
すべての実装がDart言語で書かれていればDartのコンパイラーは誤ってソースコードを消すことはないが、javaなどのネイティブ言語が絡むようなソースコードは誤って消すかもしれない。
そういったプログラムに関しては
・@pragma(‘vm:entry-point’)をつけておけば削除されずに済む
というように受け取りました。
更に原理を突き詰めたい人は公式サイトを読んでもらうとして
もっとザックリ考えると
Dart側で実装しているコンパイラーに削除されないための『おまじない』
と捉えて良いと思います。
中級者への道
今回は
というお題でした。
もちろん、ここまで問題点を明らかにすれば問題は解決します。
しかし
ここから更に
言葉や発想を変えてみてください。
というように考えて調べていくと
知識や考え方が更に広がっていきます。
1つの疑問を解消すれば芋づる式に
たくさんの知見が広がっていくはずです。