flutter插件开发学习之旅(8)-------键值对处理

前言

经过这个系列的上一篇博客,大家学习到了怎么参数传递,不过现在的参数传递大部分都是用键值对的,那么今天我们就学习一下怎么把参数进行键值对处理。

准备工具

这套课程是采用Android Studio和xcode进行开发的。当前在此之前请准备好Flutter开发环境,我这里就不进行讲解了。

IOS

这篇博客,IOS的部分比较好处理,我就先讲IOS的这端的处理

IOS底层处理

else if([@"sendMessage" isEqualToString:call.method]){
	  //接受flutter上层传递的参数
      NSDictionary* argsMap=call.arguments;
      NSString * message=argsMap[@"message"];
      NSString * info=argsMap[@"info"];
		
	 //对字符串进行拼接
      NSString * newMessage=[NSString stringWithFormat:@"%@%@",@"IOS端:",message];
      NSString * newInfo=[NSString stringWithFormat:@"%@%@",@"IOS端:",info];
	
	//打印字符串
      NSLog(newMessage);
      NSLog(newInfo);
      
      //以键值对的形式返回,传回上次
      result(@{@"message": message,@"info":@"flutter_info"});
  }

Android

Android处理键值对,相对复杂,需要三个类

ConstraintsMap类

public class ConstraintsMap {

    private final Map<String, Object> mMap;

    public ConstraintsMap(){
        mMap = new HashMap<String,Object>();
    }

    public ConstraintsMap(Map<String, Object> map){
        this.mMap = map;
    }

    public Map<String, Object> toMap() {
        return mMap;
    }

    public boolean hasKey(String name){
        return this.mMap.containsKey(name);
    }

    public boolean isNull(String name){
        return mMap.get(name) == null;
    }

    public boolean getBoolean(String name){
        return (boolean) mMap.get(name);
    }

    public double getDouble(String name){
        return (double) mMap.get(name);
    }

    public int getInt(String name) {
        if(getType(name) == ObjectType.String) {
            return Integer.parseInt(((String)mMap.get(name)));
        }
        return (int) mMap.get(name);
    }

    public String getString(String name){
        return (String) mMap.get(name);
    }

    public ConstraintsMap getMap(String name){
        return new ConstraintsMap((Map<String, Object>)mMap.get(name));
    }

    public ObjectType getType(String name) {
        Object value = mMap.get(name);
        if (value == null) {
            return ObjectType.Null;
        } else if (value instanceof Number) {
            return ObjectType.Number;
        } else if (value instanceof String) {
            return ObjectType.String;
        } else if (value instanceof Boolean) {
            return ObjectType.Boolean;
        } else if (value instanceof Map) {
            return ObjectType.Map;
        } else if (value instanceof ArrayList) {
            return ObjectType.Array;
        } else {
            throw new IllegalArgumentException("Invalid value " + value.toString() + " for key " + name +
                    "contained in ConstraintsMap");
        }
    }

    public void putBoolean(String key, boolean value) {
        mMap.put(key, value);
    }

    public void putDouble(String key, double value) {
        mMap.put(key, value);
    }

    public void putInt(String key, int value) {
        mMap.put(key, value);
    }

    public void putString(String key, String value) {
        mMap.put(key, value);
    }

    public void putNull(String key) {
        mMap.put(key, null);
    }

    public void putMap(String key, Map<String, Object> value) {
        mMap.put(key, value);
    }

    public void merge(Map<String, Object> value) {
        mMap.putAll(value);
    }

    public void putArray(String key, ArrayList<Object> value) {
        mMap.put(key, value);
    }

}

ObjectType 枚举值

public enum ObjectType {
    Null,
    Boolean,
    Number,
    String,
    Map,
    Array,
}

FlutterPlugin1Plugin

if(call.method.equals("sendMessage")){
	  //接受参数
      String message=call.argument("message");
      String info=call.argument("info");
      System.out.println("Java层--->message:"+message);
      System.out.println("Java层--->info:"+info);
	
	 //键值对处理
      ConstraintsMap params=new ConstraintsMap();
      params.putString("message",message);
      params.putString("info","infoData");

	  //返回键值对
      result.success(params.toMap());
    }

Flutter

Flutter调用底层

  static Future<String>sendMessage(String message) async {
	//这里传递多个参数
    final Map<dynamic,dynamic> res = await _channel.invokeMethod('sendMessage',<String,dynamic>{"message":message,"info":'infoDate'});
    //接受底层传回来的参数
    String res_message=res['message'];
    String res_info=res['info'];
    print(res_info);
    return res_message;
  }

flutter布局

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  Future<void> initPlatformState() async {
    String platformVersion;
    try {
      platformVersion = await FlutterPlugin1.getNative;
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            children: <Widget>[
              Text('Running on: $_platformVersion\n'),
              RaisedButton(
                child: Text(
                    '参数传递',
                  style: TextStyle(
                    fontSize: 28.0
                  ),
                ),
                onPressed: () async{
                  String message=await FlutterPlugin1.sendMessage('Flutter Plugin');
                  print("Flutter:"+message);

                },
              )
            ],
          ),
        ),
      ),
    );
  }
}

今天就分享到这里了,希望这篇博客可以给你在flutter插件开发提供帮助。喜欢的朋友关注一下

发布了50 篇原创文章 · 获赞 35 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_35905501/article/details/89642619