'MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences) while getting FCM in background

I'm working on a Flutter app in which I'm using the shared_preferences: ^2.0.13 package.

  • Flutter version : 2.10.1 (latest)

  • gradle version: 6.7

  • Android gradle plugin version: 4.1.3

  • kotlin version: 1.6.10

  • flutterEmbedding 2 (in android menifiest)

MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences).

While getting FCM message received in background.

main.dart

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();

  print('Got a message onBackgroundMessageHandler_');
  print("Handling a background message: ${message.messageId}");

  print('Shared pref process starts');
  SharedPreferences sf = await SharedPreferences.getInstance();
  sf.setString("key", "Value");
  print('${sf.getKeys()}');
  print('Shared pref process ends');
}

void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(const MyApp());
}

MainActivity.kt

class MainActivity: FlutterActivity() {

}


Solution 1:[1]

please reference to my post

you need to register share_preference for background access

io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin.registerWith(registry.registrarFor("io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin"));

Solution 2:[2]

Some edit into your code below:


import 'package:shared_preferences_android/shared_preferences_android.dart';
import 'package:shared_preferences_ios/shared_preferences_ios.dart';

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();

  print('Got a message onBackgroundMessageHandler_');
  print("Handling a background message: ${message.messageId}");

  print('Shared pref process starts');
  // I am not sure what does SharedPreferencesAndroid.registerWith(); but it can solve problem
  if (Platform.isAndroid) SharedPreferencesAndroid.registerWith();
  if (Platform.isIOS) SharedPreferencesIOS.registerWith();
  SharedPreferences sf = await SharedPreferences.getInstance();
  sf.setString("key", "Value");
  print('${sf.getKeys()}');
  print('Shared pref process ends');
}

void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(const MyApp());
}

There wasn't a little bit of information about it, espacially in firebase cloud messaging docs. I think this information must be available in onBackgroundMessage section of docs!

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Jim
Solution 2 MerdanDev