Отправка данных из native во flutter

#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)

  1. Создайте канал платформы на вашем AppDelegate (или MainActivity на Android) и зарегистрируйтесь для того же канала на стороне dart / flutter (возможно, main.dart и зарегистрируйте такой метод, как onPushClicked )
  2. Прослушайте ваши сообщения parse в вашем машинном коде
  3. Отправьте их в свой 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("")
}