Flutter调用原生Android的Java方法

一、编写main.dart

import 'package:flutter/material.dart';

import 'MainPage.dart';

void main(){
  runApp(
     MyApp()
  );
}

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'default',
      theme: defaultTheme,
      home: MainPage(),
    );
  }
}


final ThemeData defaultTheme = ThemeData(
    primaryColor: Colors.lightBlue
);

 

二、编写MainPage.dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class MainPage extends StatefulWidget{
  @override
  MainPageState createState()  => MainPageState();
}

class MainPageState extends State<MainPage>{
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter调用原生Android的方法',
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter调用原生Android的Java方法'),
        ),
        body: Center(
          child:
          RaisedButton(
            child:
            Padding(
              padding: EdgeInsets.only(left: 20,right: 20,top: 20,bottom: 20),
              child: Text('点击按钮调用原生Android的Java方法\n,返回值在控制台输出'),
            ),

            onPressed: ()async{
              const platform = const MethodChannel("toJava");
              String returnValue = await platform.invokeMethod("张三");
              print("从原生Android的java方法返回的值是:"+returnValue);
            },
          )
        )
      ),
    );
  }

}

 

三、编写MainActivity类

注意事项:
新版的Flutter SDK默认使用的是 import io.flutter.embedding.android.FlutterActivity; 包,
则在MethodChannel方法中的第一个参数填写 getFlutterEngine().getDartExecutor().getBinaryMessenger()
如果你使用的Flutter的SDK是旧版本,那么默认的是 import io.flutter.app.FlutterActivity; 包
则MethodChannel方法中的第一个参数填写 getFlutterView()
package com.example.flutterTojava;

import android.os.Bundle;
import android.os.StrictMode;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugin.common.BinaryMessenger;
//import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {

    private static final String channel = "toJava";

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }

        new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(),channel).setMethodCallHandler(
                new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                        if (methodCall.method!=null) {
                            result.success(toJava(methodCall.method));
                        } else {
                            result.notImplemented();
                        }
                    }
                }
        );
    }


    public String toJava(String name){
        System.out.println("传递的参数是"+name);
        return "您好"+name;
    }

}

 

四、控制台输出

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Flutter调用 Android 原生代码,可以通过使用 Flutter 的平台通道(Platform Channel)来进行交互。下面是一个简单的示例,演示了如何调用 Android 原生代码: 1. 在 Flutter 项目的 `lib` 目录下创建一个新的 Dart 文件(例如 `native.dart`),用于定义与原生代码交互的接口。 ```dart import 'package:flutter/services.dart'; class NativeCode { static const platform = MethodChannel('com.example.app/native'); static Future<void> callNativeMethod() async { try { await platform.invokeMethod('nativeMethod'); } catch (e) { print(e); } } } ``` 2. 在 Android 项目的 `android/app/src/main/java/com/example/app` 目录下创建一个新的 Java 类(例如 `NativeChannel.java`),用于处理 Flutter原生代码之间的通信。 ```java package com.example.app; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; public class NativeChannel implements FlutterPlugin, MethodCallHandler { private MethodChannel channel; @Override public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "com.example.app/native"); channel.setMethodCallHandler(this); } @Override public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("nativeMethod")) { // 在这里编写你的原生代码逻辑 // ... result.success(null); // 返回结果给 Flutter } else { result.notImplemented(); } } @Override public void onDetachedFromEngine(FlutterPluginBinding binding) { channel.setMethodCallHandler(null); channel = null; } } ``` 3. 在 `MainActivity.java` 中注册 NativeChannel 插件: ```java import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; public class MainActivity extends FlutterActivity { @Override public void configureFlutterEngine(FlutterEngine flutterEngine) { super.configureFlutterEngine(flutterEngine); flutterEngine.getPlugins().add(new NativeChannel()); } } ``` 4. 在 Flutter调用原生方法,例如在一个按钮的点击事件中: ```dart ElevatedButton( onPressed: () { NativeCode.callNativeMethod(); }, child: Text('调用原生方法'), ) ``` 通过以上步骤,你就可以在 Flutter调用 Android 原生代码了。你可以根据需要扩展这个示例,添加更多的方法和参数来实现更复杂的交互。记得在调用原生方法时,遵循正确的线程调度和错误处理方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值