Flutter 调用 rust 踩坑之旅

780 阅读2分钟

说明

针对一个以前老的技术架构,技术栈是由C/C++、PHP、Java、jquery、html等一些技术,但是发现开发周期长,而新的语言和技术框架学习后感觉解决了很多以前遇到的问题。 新的技术栈经过调查和学习后选择有如下技术栈:

  • Uni-app:小程序必须、可以发布APP,很强大
  • Flutter:生态很成熟,适合写和底层交互比较多的APP(之前和uni-app、rn等等做个比较qt开发移动端都试过)
  • Golang:高并发服务器(tcp长连接和http的restful api多很有优势)
  • Rust:跨平台终端底层库(ffi\jni\wasm等等都可以实现)
  • Vue:后台web管理界面,实现前后端分离

注意:技术有限,目前只做了一些调查和实践,golang也可以终端底层,但真没rust好用;rust也可以写服务器,但我没写过,golang也非常够用。

1. Cannot invoke native callback outside an isolate.

Flutter 线程内存不共享,回调函数不能在子线程调用;

1.1 详细说明

Flutter一般通过创建隔离区来调用底层的FFI,但是我传入的回调函数,只能在隔离区的线程中使用,so中再创建线程就不能调用,系统会报Cannot invoke native callback outside an isolate.

1.2 解决方案

不在子线程调用就好了(好像是解决了)

2. Connection Failed: tls connection init failed: Interrupted system call (os error 4)

用ureq基于rustls 的https请求是就会遇到这个问题

2.1 详细说明

(在jni没发现,flutter中有这个问题)

2.2 解决方案

忽略系统中断 github.com/rustls/rust…

while !eof && self.wants_read() {
debug!("read_tls");
match self.read_tls(io) {
    Ok(0) => {
        eof = true;
        debug!("eof");
        break;
    }
    Ok(n) => {
        rdlen += n;
        debug!("read {} bytes", n);
        break;
    }
    Err(ref err) if err.kind() == io::ErrorKind::Interrupted => {
        // nothing to do
        debug!("complete_io: read interrupted");
    }
    Err(err) => {
        return Err(err);
    }
};