Извлечение аргументов в модуле Flutter

#java #android #flutter #flutter-method-channel

#java #Android #флаттер #flutter-метод-канал

Вопрос:

У меня есть собственное приложение для Android. Я импортировал модуль Flutter. Теперь я могу успешно перейти к выбранному маршруту из своего приложения для Android. Я знаю, что передача данных между родной и флаттерной сторонами осуществляется по каналам метода. Но я не понял, как это реализовать при запуске Activity.

Вот мой репозиторий на GitHub.

 startActivity(
         new FlutterActivity.NewEngineIntentBuilder(MyFlutterActivity.class)
                   .initialRoute("/secondScreen")
                   .build(getApplicationContext())
                   .putExtra("title", "Hello")); // Here, title is passed!
 

Как я могу обработать этот заголовок на моем initState of secondScreen ?

 class SecondScreen extends StatefulWidget {
  SecondScreen({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _SecondScreenState createState() => _SecondScreenState();
}

class _SecondScreenState extends State<SecondScreen> {
  @override
  void initState() {
    super.initState();
    print("title");
    print(widget.title); // Ofc, it is null. I want it as 'Hello'!
  }
 

Комментарии:

1. Вот статья об обмене данными между собственными компонентами и компонентами Flutter.

Ответ №1:

Теперь я нашел подход. Я уверен, что есть способы получше этого. Сначала я переопределю onCreate метод MyFlutterActivity class . Затем задайте параметр в глобальной переменной.

 String title = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle extras = getIntent().getExtras();

    title = extras.getString("title");
}

@Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);

    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(((methodCall, result) -> {
        if (methodCall.method.equals("getBatteryLevel")) {

            result.success("batteryLevel"); // It returns string "batteryLevel".

        } else if (methodCall.method.equals("getTitle")) {

            result.success(title); // It returns string "Hello".

        } else {
            result.notImplemented();
        }
    }));
  }
 

Теперь я могу вызвать метод в моем initState of SecondScreen , чтобы получить заголовок, который полностью передан с родной стороны.

   var title = await platformMethodChannel.invokeMethod('getTitle');