Tôi đã dành nhiều ngày cố gắng tìm ra cách thêm UI Flutter vào Ứng dụng Android hiện tại của mình. Thách thức lớn nhất là làm cho Phương thức hoạt động với FlutterActivity được gọi từ MainActivity. Tôi biết điều này hơi khác so với câu hỏi được hỏi ở đây, nhưng bài đăng này đã được trả lại khi tôi thực hiện tìm kiếm 'Android FlutterActivity MethodChannel'. Sau khi tìm hiểu nhiều tài nguyên về cách thực hiện việc này, cuối cùng tôi đã tìm thấy giải pháp của mình tại đây:
https://github.com/flutter/samples/tree/master/add_to_app/android_USE_plugin/app/src/main/java/dev/flutter/ ví dụ / androidUSEplugin
Ban đầu, trong Android Studio, với ứng dụng hiện có được mở, tôi đã gõ Tệp, Mới, Mô-đun mới, Mô-đun Flutter. Tôi đã nhận được một lỗi và phải thực hiện các bước thủ công.
Mục tiêu của tôi là khởi chạy FlutterActivity (mở main.dart trong flutter_module) trong MainActivity - onCreate, sau đó phát triển Flutter 'màn hình' tận dụng càng nhiều mã Flutter gốc càng tốt, với các lệnh gọi Nền tảng giới hạn sử dụng Phương thức kênh. Khi tôi phát triển mã Flutter thay thế, tôi sẽ tiếp tục nhận xét về Mã Android hiện có.
Đây là những gì cuối cùng đã làm việc cho tôi:
../App_Project/Android/Ex hiện_Android_App / sinstall.gradle
include ':app'
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir.parentFile, '../flutter_module/.android/include_flutter.groovy'))
include ':flutter_module’
project(':flutter_module’).projectDir = new File('../../flutter_module’)
rootProject.name=‘existing_android_app’
../App_Project/Android/Ex hiện_Android_App / app / build.gradle
dependencies {
…
implementation project(':flutter')
}
../App_Project/Android/Ex hiện_Android_App / app / src / main /AndroidManifest.xml
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize" />
../App_Project/Android/Ex hiện_Android_App / app / src / main / java / com / ex hiện_android_app / MainActivity.java
package com.existing_android_app;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.FlutterEngineCache;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends AppCompatActivity {
final String ENGINE_ID = "1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FlutterEngine flutterEngine = new FlutterEngine(this);
flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());
FlutterEngineCache.getInstance().put(ENGINE_ID, flutterEngine);
MethodChannel channel = new MethodChannel(flutterEngine.getDartExecutor(), "com.existing_android_app/myMethodChannel");
channel.setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
String url = call.argument("url");
if (call.method.equals("openBrowser")) {
openBrowser(url);
}
else {
result.notImplemented();
}
}
});
startActivity(FlutterActivity.withCachedEngine(ENGINE_ID).build(this));
}
void openBrowser(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
this.startActivity(intent);
}
}
../App_Project/flutter_module/lib/home_page.dart
class AppHomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<AppHomePage> {
static const platform = const MethodChannel(‘com.existing_android_app/myMethodChannel’);
Future<void> _openBrowser() async {
try {
final int result = await platform.invokeMethod('openBrowser', <String, String> { 'url': "http://bing.com” });
}
catch (e) {
print('***** _openBrowser error: ' + e.toString());
}
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: CustomAppBar(),
body: Column(
children: <Widget>[
RaisedButton(
label: Text('Search',
style: TextStyle(fontSize: 18.0),
),
onPressed: () { _openBrowser(); },
) // RaisedButton.icon
], // Widget
) // Column
) // Scaffold
); // SafeArea
}