Flutter进阶-混合开发上篇

「这是我参与2022初次更文应战的第1天,活动详情检查:2022初次更文应战」

混合开发的方法

提到混合开发,咱们知道无非是两种:

  1. Flutter调用原生的功能,比如调用相册呀之类的
  2. 原生项目的某一些功能或者页面运用Flutter(不太主张),不主张的原因是它不像Web页面能够 轻量级的嵌入,Flutter会比较重,因为它的独立渲染引擎。

Flutter调用原生

咱们用之前的微信Demo的个人中心头像来做示例,点击头像的时分,唤醒原生的相册。

GestureDetector(
  onTap: () {
     print('需求引发原生的 相机');
    _methodChannel.invokeMapMethod('takePhotos');
  },
  child: Container(
     width: 70,
     height: 70,
     decoration: BoxDecoration(
        image:
          DecorationImage(image: AssetImage('images/游戏2.png')),
             borderRadius: BorderRadius.circular(10)),
  ),
),

在Flutter和 iOS中通讯供给了一个专门的类MethodChannel用来通信

 MethodChannel _methodChannel = MethodChannel('mine/method');

onTap的时分调用_methodChannel.invokeMapMethod('takePhotos');告诉iOS原生我向你发起了一个takePhotos的办法,iOS你在接收到这个标识的时分要给我调起你自己的相机哦~ ​

此刻咱们来到iOS的项目中:

  1. 首要示例化FlutterMethodChannel这个类,该类的第一个参数是指明哪个途径下的办法
  2. 调用setMethodCallHandler来呼应Flutter发出来的讯息
  3. 辨认当时的办法针对处理
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    var pickVc = UIImagePickerController()
    var flutterChannel: FlutterMethodChannel!
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)
        let vc = self.window.rootViewController as? FlutterViewController
        pickVc.delegate = self
      	// 在iOS端也初始话这个通讯的类
        flutterChannel = FlutterMethodChannel.init(name: "mine/method", binaryMessenger: vc as! FlutterBinaryMessenger)
      	// 对Flutter端发过来的通讯处理
        flutterChannel.setMethodCallHandler { call, result in
            // 如果我辨认了这个办法是`takePhotos`  我就引发原生相机                               
            if call.method.isEqual("takePhotos"){
                print("办法来了");
                self.pickVc.delegate = self
                vc?.present(self.pickVc, animated: true, completion: nil)
            }
        }
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

Flutter进阶-混合开发上篇

  1. 当然啦,在iOS中选中了照片,把照片中的信息再回传给Flutter中,调用invokeMethod回传
extension AppDelegate: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let imagePathURL = info[UIImagePickerController.InfoKey.imageURL] as? NSURL,
           let imagePath = imagePathURL.absoluteString {
            self.flutterChannel.invokeMethod("editedImage", arguments: imagePath)
        }
        picker.dismiss(animated: true, completion: nil)   
    }
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    } 
}

5.Flutter中收到iOS原生端挑选的图片之后,也呼应setMethodCallHandler

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _methodChannel.setMethodCallHandler((call) {
      if (call.method == 'editedImage') {
        print(call.arguments);
      }
      return call.arguments;
    });
  }

Flutter进阶-混合开发上篇
至此,两头的通讯现已完成了,咱们能够运用拿到的照片途径替换当时的图片了。

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _methodChannel.setMethodCallHandler((call) {
      if (call.method == 'editedImage') {
        print(call.arguments);
        setState(() {
          String subString = call.arguments.toString().substring(7);
          _avatarFile = File(subString);
        });
      }
      return call.arguments;
    });
  }
BoxDecoration(
   image: DecorationImage(
            image: _avatarFile == null
             ? AssetImage('images/游戏2.png') as ImageProvider
             : FileImage(_avatarFile!),
             fit: BoxFit.cover),
   borderRadius: BorderRadius.circular(10)
)

Flutter进阶-混合开发上篇

image_picker

还有一种运用pub的方法唤醒相机,这儿运用到了Flutter官方出品的一个库image_picker

Flutter进阶-混合开发上篇

咱们安装之后能够参考一下用法,本文的运用还是比较简单的

  void _pickerImage() async {
    try {
      XFile? file = await _picker.pickImage(source: ImageSource.gallery);
      if (file != null && mounted) {
        setState(() {
          _avatarFile = File(file.path);
        });
      }
    } catch (e) {
      print(e.toString());
      setState(() {
        _avatarFile = null;
      });
    }
  }

其间这儿有一个小bug,当咱们挑选模拟器中的第一个相片的时分;会报错,所以在此刻加了 异常处理

Flutter进阶-混合开发上篇

温馨提示:记得要在iOS的info.plist文件中装备相册的权限!

写代码像蔡徐抻
分享 收藏 点赞(0)
上一篇
Linux 是否有 zombie thread?从glibc和内核源码探究
下一篇
#41 AI-002-十分钟理解ChatGPT的技术逻辑及演进(前世、今生)

聚圣源园林起公司什么名字好晏起名字战神2pc版长歌行电视剧全集免费西瓜马天宇老婆叫什么名纳兹·多拉格尼尔九成国家公共卫生服务受疫情冲击空间鼠标特效时光之轮东北二嫂汪姓女宝宝起名字2021年免费公司起名字网站大全起名好的网站免费人类命运共同体的内涵姓戴女人起名字男五行缺金的起名以撒的结合图鉴神仙老师狗十旬休假骆的拼音和组词外交部哀悼松山树子姓易的女孩子起名父亲姓王母亲姓唐给孩子起名宠物兔名字qq飞车光天使怎么得借钱app哪个最靠谱电视家软件网上转账要手续费吗功夫战警演员表赵靖忠淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化