web-dev-qa-db-ja.com

バックグラウンドでFlutterメソッドチャンネルを使用する方法(最小化/閉鎖)

私はネイティブAndroid Flutterアプリ内のウィジェット)に取り組んでいます。リフレッシュボタンがある。通信のために、アプリがフォアグラウンドになっているときはうまく機能しています。しかし、アプリが最小化されているか閉じているときは機能しません。エラーPlatformException(No_Activity、Null、Null)を取得します。以下は私のコードです。

Android(AppWidgetProvider)

if (methodChannel == null && context != null) {
        FlutterMain.startInitialization(context)
        FlutterMain.ensureInitializationComplete(context, arrayOf())

        // Instantiate a FlutterEngine.
        val engine = FlutterEngine(context.applicationContext)

        // Define a DartEntrypoint
        val entrypoint: DartEntrypoint = DartEntrypoint.createDefault()

        // Execute the DartEntrypoint within the FlutterEngine.
        engine.dartExecutor.executeDartEntrypoint(entrypoint)

        // Register Plugins when in background. When there
        // is already an engine running, this will be ignored (although there will be some
        // warnings in the log).
        //GeneratedPluginRegistrant.registerWith(engine)

        methodChannel = MethodChannel(engine.dartExecutor.binaryMessenger, MainActivity.CHANNEL)
}

methodChannel!!.invokeMethod("fetchNewData", "", object : MethodChannel.Result {
        override fun notImplemented() {
            Toast.makeText(context, "method not implemented", Toast.LENGTH_SHORT).show()
        }

        override fun error(errorCode: String?, errorMessage: String?, errorDetails: Any?) {
            Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show()
        }

        override fun success(result: Any?) {
            Toast.makeText(context, "success", Toast.LENGTH_SHORT).show()
        }
})
 _

ひらひら

/// calling in main
static Future<void> attachListeners() async {
    WidgetsFlutterBinding.ensureInitialized();
    var bloc = new AqiCnDashboardBloc();
    _channel.setMethodCallHandler((call) {
      switch (call.method) {
        case 'fetchNewData':
          bloc.getAqiCn(false);
          return null;
        default:
          throw MissingPluginException('notImplemented');
      }
    });
}
 _
5
Shahbaz Hashmi

私はバックグラウンドでフラッタエンジンを実行するために私たちをリダイレクトする情報/ディスカッションを収集しています。

void callbackDispatcher() {
WidgetsFlutterBinding.ensureInitialized();
print("Our background job ran!");
 _

}

void main() {

 static const MethodChannel _channel = const MethodChannel("channel-name");

 Future<void> initialize(final Function callbackDispatcher) async {

  final callback = PluginUtilities.getCallbackHandle(callbackDispatcher);

 await _channel.invokeMethod('initialize', callback.toRawHandle());
 }
}
 _

ここに述べたように 背景にフラッタを実行する方法は?

バックグラウンドジョブがネイティブで起動されると、Flutter Engineはアクティブではありません。だから私たちはダーツを実行することができません。 Android/iOSはバックグラウンドでフラッタエンジンを起動できますか?はい!最初に、バックグラウンドジョブがネイティブコードによって起動されるたびに呼び出されるDARTコールバック関数を登録する必要があります。このコールバック関数はCallBackDispatcherと呼ばれます。

また、これらのStackOverflowディスカッションをチェックしてください。

Flutter:背景サービスとしてアプリを実行

常にバックグラウンドで実行するアプリをアプリを作成するためにFlutterでサービスを作成する方法

アプリが閉じたときにも機能するフラッタバックグラウンドサービスを作成する方法

Flutterプラグインとジオフェンシングの背景のダーツの実行

1
Jiten Basnet