FlutterActivity MethodChannel and FlutterView FlutterActivity MethodChannel and FlutterView flutter flutter

FlutterActivity MethodChannel and FlutterView


Instead of flutterView use flutterEngine.getDartExecutor().


I spent days trying to figure out how to add a Flutter UI to my existing Android App. The biggest challenge was getting the MethodChannel to work with FlutterActivity being called from MainActivity. I know this is a little different than the question asked here, but this post was returned when I did searches for 'Android FlutterActivity MethodChannel'. After going through many resources on how to do this, I finally found my solution here:https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/example/androidusingplugin

Initially, in Android Studio, with the existing app opened, I tapped File, New, New Module, Flutter Module. I received an error and had to perform manual steps.

My objective is to launch FlutterActivity (opens main.dart in the flutter_module) in MainActivity - onCreate, then develop Flutter 'screens' leveraging as much native Flutter code as possible, with limited Platform calls using the MethodChannel. As I develop replacement Flutter code, I will continue to comment on the existing Android Code.

Here is what finally worked for me:

../App_Project/Android/Existing_Android_App/settings.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/Existing_Android_App/app/build.gradle

dependencies {…    implementation project(':flutter')}

../App_Project/Android/Existing_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/Existing_Android_App/app/src/main/java/com/existing_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  }


You should use

import io.flutter.embedding.android.FlutterActivity;

and declare your patformChannel in

     @Override  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {    GeneratedPluginRegistrant.registerWith(flutterEngine);    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)        .setMethodCallHandler(          (call, result) -> {            // Note: this method is invoked on the main thread.            // TODO          }        );  }

for more you can check the documentation: https://flutter.dev/docs/development/platform-integration/platform-channels