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