dart

【flutter】エミュレータは動くのにリリースしたら動かない場合に試すこと

リリースしたら動かない!

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’)とは?

そもそも@pragma(‘vm:entry-point’)って何?

という勉強熱心な方もいると思います。

調べたところDart公式のGitHubサイトに説明がありました。

Dartのコンパイラーに関わってくるので

すべてを理解できませんでしたが

以下のように解釈しました。

すべての実装がDart言語で書かれていればDartのコンパイラーは誤ってソースコードを消すことはないが、javaなどのネイティブ言語が絡むようなソースコードは誤って消すかもしれない。

そういったプログラムに関しては
・@pragma(‘vm:entry-point’)

をつけておけば削除されずに済む

というように受け取りました。

更に原理を突き詰めたい人は公式サイトを読んでもらうとして

もっとザックリ考えると

Dart側で実装しているコンパイラーに削除されないための『おまじない』

と捉えて良いと思います。

中級者への道

今回は

エミュレーターの時は動いたけどリリースしたら動かない。。

というお題でした。

もちろん、ここまで問題点を明らかにすれば問題は解決します。

しかし

ここから更に

言葉や発想を変えてみてください。

エミュレータ動かした時ととリリースした時って、具体的に何が違うの?

というように考えて調べていくと

知識や考え方が更に広がっていきます。

1つの疑問を解消すれば芋づる式に

たくさんの知見が広がっていくはずです。

1つの問題について、発想を変えて更に調べる

広告




関連記事