url_launcherで発生したMissingPluginExceptionの対処法

1 min read読了の目安(約1600字

Flutterのurl_launcherを使ってAndroidでURLを開こうとしたときに、MissingPluginExceptionが発生してハマったので、対処法ここに記す。

エラーメッセージ

E/flutter ( 8237): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: MissingPluginException(No implementation found for method launch on channel plugins.flutter.io/url_launcher)
E/flutter ( 8237): #0      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7)
E/flutter ( 8237): <asynchronous suspension>
E/flutter ( 8237): #1      MethodChannelUrlLauncher.launch.<anonymous closure> (package:url_launcher_platform_interface/method_channel_url_launcher.dart)
E/flutter ( 8237): <asynchronous suspension>

対処法

MainActivity.ktを以下のように変更する。

import android.os.Bundle
import io.flutter.app.FlutterActivity
// 追加
import io.flutter.plugins.urllauncher.UrlLauncherPlugin

class MainActivity : FlutterActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
	// 追加
	UrlLauncherPlugin.registerWith(registrarFor("io.flutter.plugins.urllauncher.UrlLauncherPlugin"))
    }
}

URLを開く部分の実装。

void _launchURL() async {
  var url = 'https://developer.android.com/?hl=ja';
  // 正しいURLかチェックする
  if (await canLaunch(url)) {
    // URLを開く
    await launch(url);
  } else {
    throw 'Could not launch $url';
  }
}

r Hot reloadR Hot restartではなく、flutter runでアプリを再起動する。

実行環境

url_launcher

dependencies:
  url_launcher: ^6.0.3

build.gradle

  • compileSdkVersion: 30
  • minSdkVersion: 16
  • targetSdkVersion: 30

flutter --version

  • Flutter 2.0.6 • channel stable
  • Dart 2.12.3