반응형
Stacktrace
Fatal Exception: java.lang.RuntimeException
Unable to create service io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService: java.lang.RuntimeException: PluginRegistrantCallback is not set.
발생 원인
발생 조건
- v2 embedding이 적용된 플러터 안드로이드 프로젝트
- Firebase_messaging 패키지를 사용
사용자 문제는 아니고 Firebase_messaging 패키지가 v2 embedding을 제대로 적용하지 않아서 생긴 문제이다.
플러터에서 네이티브 코드를 호출하기 위해서는 패키지 내부 소스코드에서 플러그인 등록을 하는 과정이 필요한데, 그 부분을 놓친 상태에서 배포된 듯 하다.
※ 2020.04.17 까지도 안고쳐지고 있다.
해결 방법
누락된 플러그인 등록 과정을 수동적으로 넣어주면 임시방편으로 해결할 수 있다.
// android/app/build.gradle
dependencies {
...
implementation 'com.google.firebase:firebase-messaging:20.1.5'
}
앱 수준의 build.gradle에 firebase-messaging 패키지를 수동으로 추가한다.
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
public final class FirebaseCloudMessagingPluginRegistrant {
public static void registerWith(PluginRegistry registry) {
if (alreadyRegisteredWith(registry)) {
return;
}
FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
}
private static boolean alreadyRegisteredWith(PluginRegistry registry) {
final String key = FirebaseCloudMessagingPluginRegistrant.class.getCanonicalName();
if (registry.hasPlugin(key)) {
return true;
}
registry.registrarFor(key);
return false;
}
}
위 FirebaseCloudMessagingPluginRegistrant 클래스를 직접 정의한다.
import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;
public class Application extends FlutterApplication implements PluginRegistrantCallback {
@Override
public void onCreate() {
super.onCreate();
FlutterFirebaseMessagingService.setPluginRegistrant(this);
}
@Override
public void registerWith(PluginRegistry registry) {
FirebaseCloudMessagingPluginRegistrant.registerWith(registry);
}
}
Application 클래스를 위 처럼 직접 정의하고 FirebaseCloudMessagingPluginRegistrant의 regiseterWith 함수를 호출하도록 구현해준다.
Application 클래스가 이미 있으면 수정해서 쓰고 없으면 MainActivity와 같은 디렉토리에 새로 정의한다.
<!-- AndroidManifest.xml -->
<application
android:name=".Application">
...
</application>
AndroidManifest.xml의 application 태그에 android:name 속성을 추가하면 해결된다.
관련 문서
반응형
'Programming > Flutter' 카테고리의 다른 글
[Flutter] 여러 페이지를 한 화면에서, PageView (0) | 2020.06.15 |
---|---|
[Flutter] Firebase cloud messaging 적용하기 (1) | 2020.04.20 |
[Flutter] Firebase를 이용하여 Sign In with Apple 사용하기 (15) | 2020.04.09 |
[Flutter] Firebase remote config 적용하기 (0) | 2020.02.28 |
[Flutter] Firebase Crashlytics 사용 설정하기 (1) | 2019.12.21 |
댓글