J'ai ajouté un widget d'écran d'accueil natif Android Android à mon application Flutter).
Dans mon implémentation AppWidgetProvider
, je voudrais appeler le code Dart dans ma méthode onUpdate()
en utilisant un canal de plateforme.
Est-ce possible? Si oui, comment y parvenir?
Mon code Android (Java) actuel:
package com.westy92.checkiday;
import Android.appwidget.AppWidgetManager;
import Android.appwidget.AppWidgetProvider;
import Android.content.Context;
import Android.util.Log;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.view.FlutterNativeView;
public class HomeScreenWidget extends AppWidgetProvider {
private static final String TAG = "HomeScreenWidget";
private static final String CHANNEL = "com.westy92.checkiday/widget";
private static FlutterNativeView backgroundFlutterView = null;
private static MethodChannel channel = null;
@Override
public void onEnabled(Context context) {
Log.i(TAG, "onEnabled!");
backgroundFlutterView = new FlutterNativeView(context, true);
channel = new MethodChannel(backgroundFlutterView, CHANNEL);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Log.i(TAG, "onUpdate!");
if (channel != null) {
Log.i(TAG, "channel not null, invoking Dart method!");
channel.invokeMethod("foo", "extraJunk");
Log.i(TAG, "after invoke Dart method!");
}
}
}
Code fléchette:
void main() {
runApp(Checkiday());
}
class Checkiday extends StatefulWidget {
@override
_CheckidayState createState() => _CheckidayState();
}
class _CheckidayState extends State<Checkiday> {
static const MethodChannel platform = MethodChannel('com.westy92.checkiday/widget');
@override
void initState() {
super.initState();
platform.setMethodCallHandler(nativeMethodCallHandler);
}
Future<dynamic> nativeMethodCallHandler(MethodCall methodCall) async {
print('Native call!');
switch (methodCall.method) {
case 'foo':
return 'some string';
default:
// todo - throw not implemented
}
}
@override
Widget build(BuildContext context) {
// ...
}
}
Lorsque j'ajoute le widget à mon écran d'accueil, je vois:
I/HomeScreenWidget(10999): onEnabled!
I/HomeScreenWidget(10999): onUpdate!
I/HomeScreenWidget(10999): channel not null, invoking Dart method!
I/HomeScreenWidget(10999): after invoke Dart method!
Cependant, mon code Dart ne semble pas recevoir l'invocation.
Tout d'abord, assurez-vous que vous appelez FlutterMain.startInitialization()
puis FlutterMain.ensureInitializationComplete()
avant d'essayer d'exécuter un code Dart. Ces appels sont nécessaires pour bootstrap Flutter.
Deuxièmement, pouvez-vous essayer ce même objectif en utilisant le nouveau Android embedding expérimental?
Voici un guide pour exécuter le code Dart en utilisant la nouvelle intégration: https://github.com/flutter/flutter/wiki/Experimental:-Reuse-FlutterEngine-across-screens
Si votre code ne fonctionne toujours pas comme prévu avec la nouvelle intégration Android, il devrait être plus facile de déboguer le problème. Veuillez publier à nouveau avec succès, ou toute nouvelle information d'erreur.
vous pouvez peut-être utiliser invokeMethod(String method, @Nullable Object arguments, MethodChannel.Result callback)
et utiliser le rappel pour obtenir la raison de l'échec.