#flutter
#flutter
Вопрос:
Я расширяю собственную реализацию FirebaseMessagingService
, чтобы ожидать push-уведомлений в native android
.
Мне нужно запустить мое приложение flutter, когда пользователь нажимает на push-уведомление, поэтому.. Как я могу отправить данные в свое приложение flutter?
Комментарии:
1. Возможно, это глупый вопрос, но есть ли причина, по которой вы просто не использовали бы плагин обмена сообщениями Firebase ?
2. @rmtmckenzie да, я использую сервер синтаксического анализа, и реализация / данные совсем другие parseplatform.org
3. Достаточно справедливо, вероятно, стоит упомянуть об этом в вопросе. Но не могли бы вы все же проверить, используете ли вы Android, и если да, активировать и использовать плагин обмена сообщениями firebase там, и обернуть плагин с небольшим количеством логики dart, чтобы преобразовать данные обратно в формат синтаксического анализа… Возможно, я здесь чего-то не хватает, но если push-уведомление отправляется Parse через firebase, пока оно проходит через firebase, теоретически оно все равно должно соответствовать формату данных firebase, не так ли?
4. Это хороший вопрос, потому что иногда мы хотим настроить уведомление
Ответ №1:
В Flutter
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget{
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ScreenPage(),
);
}
}
class ScreenPage extends StatefulWidget {
@override
_ScreenPageState createState() => _ScreenPageState();
}
class _ScreenPageState extends State<ScreenPage> {
static const platform = const MethodChannel("myChannel");
@override
void initState() {
platform.setMethodCallHandler(nativeMethodCallHandler);
super.initState();
}
Future<dynamic> nativeMethodCallHandler(MethodCall methodCall) async {
print('Native call!');
switch (methodCall.method) {
case "methodNameItz" :
return "This data from flutter.....";
break;
default:
return "Nothing";
break;
}
}
@override
Widget build(BuildContext context) {
//return ();
}
}
На Java
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;
//import io.flutter.view.FlutterNativeView;
public class MyJavaFile extends FlutterActivity {
Button clickMeButton;
MethodChannel channel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
channel = new MethodChannel(getFlutterView(), "myChannel");
setContentView(R.layout.home_activity);
clickMeButton = findViewById(R.id.clickMeButton);
clickMeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
channel.invokeMethod("methodNameItz", null, new MethodChannel.Result() {
@Override
public void success(Object o) {
Log.d("Results", o.toString());
}
@Override
public void error(String s, String s1, Object o) {
}
@Override
public void notImplemented() {
}
});
}
});
}
}
Ответ №2:
В принципе, вы все еще можете посмотреть на пример обмена сообщениями firebase (или то же самое для Android)
- Создайте канал платформы на вашем
AppDelegate
(илиMainActivity
на Android) и зарегистрируйтесь для того же канала на стороне dart / flutter (возможно,main.dart
и зарегистрируйте такой метод, какonPushClicked
) - Прослушайте ваши сообщения parse в вашем машинном коде
- Отправьте их в свой dart-код, используя platform channel (как показано в приведенном выше примере)
channel.invokeMethod('onPushClicked', myMessageArguments)
Комментарии:
1. Что делать, когда приложение закрыто? Мне нужно передать данные в приложение
2. Ваш вопрос касался «запуска моего приложения flutter, когда пользователь нажимает на push-уведомление» — поэтому, когда пользователь нажимает на push-уведомление, ваше приложение оказывается на переднем плане. Запуск кода dart и взаимодействие с плагинами в фоновом режиме — это совсем другая проблема с червями. смотрите github.com/flutter/flutter/issues/21925 и следуйте github.com/flutter/flutter/issues/24278 и лучшее руководство прямо сейчас medium.com/flutter-io /… — ie. подождите несколько недель, пока не обновится сообщение medium, надеюсь
Ответ №3:
flutter
Map<String,dynamic> data = <String,dynamic>{};
final res = await methodChannel.invokeMethod('getDistance');
data = Map<String,dynamic>.from(res);
final dis = data['distance'] as String;
final tim = data['time'] as String;
ios native
switch call.method {
case "getDistance":
let data =
["distance":routeFormattedDistance,"time":routeFormattedTravelTime]
result(data)
default :
result("")
}