Flutter来了,你慌了吗

446 阅读4分钟
原文链接: mp.weixin.qq.com

在刚过去的一周里Google公布了第一个预览版的Flutter, Flutter 的首个「发布预览版」全球发布如果你接触过React-Native的话,Flutter是一个跟RN差不多的框架。它支持跨平台运行,一次开发,就可以在Android和IOS上同时运行。

很多人预测这会给现在的移动开发带来一些改变,也可能预示着未来Android开发的发展方向。今天花几分钟了解一下Flutter是个什么东西,你才能判断对自己有什么影响。

什么是Flutter

可以把Flutter理解为一个跟Android Framework一样的中间层框架,它提供接口和控件给开发者,同时它自己会维护UI的更新,线程的控制。在原理上,Flutter是一个c++引擎作为中间件支撑UI运行的。

然后,它的开发基于 dart语言,如果你了解Web开发的话,下面的语言风格可能不陌生

void main() => runApp(new MyApp());class MyApp extends StatelessWidget {  // This widget is the root of your application.  @override  Widget build(BuildContext context) {    return new MaterialApp(      title: 'Startup Name Generator',      home: new Text('Hello Futter'),      theme: new ThemeData(          primaryColor: Colors.white      ),    );  }}

如果你是Java开发也没关系, dart是面向对象语言,只要有Java的基础,很快就能上手 dart开发。上面用几行代码就完成了一个 Hello World界面,非常简单,Flutter也不需要通过 xml来定义 layout,可能对于Android开发者来说不太习惯,而对于Web开发者来说就比较熟悉了。

Flutter的UI

在Flutter上,没有跟Android一样的Activity/Fragment这种概念,取而代之的是 Widget和State。可以理解为,在 Flutter上,一切都是 widget,而 Activity的跳转,Fragment的切换,都可以理解为 Widget在 UI栈上的push和pop。

而State是什么呢,官方解释是,关于每个Widget都有自己的状态,像Button的pressed和normal状态,Image的Color值,在Flutter上都可以理解为State。粗浅的理解的话,Widget负责定义UI该显示什么,State负责定义UI该怎么显示。

Flutter的线程

Flutter跟Web有点相似,它只有一个线程,也是UI线程。但是对于耗时操作,它也提供了 async和wait接口来供开发者处理复杂的事务。

loadData() async {  String dataURL = "https://jsonplaceholder.typicode.com/posts";  http.Response response = await http.get(dataURL);  setState(() {    widgets = json.decode(response.body);  });}

在这段代码中,loadData()定义了一个方法,async 字段声明这是一个异步的方法,在方法体中通过 await声明了耗时操作,Flutter会自动帮开发者处理耗时的事情,直到操作完成,就会接着调用 setState()方法来更新UI。

Flutter跟原生Android的交互

跟RN类似,在开发的过程中总会为了各种各样的原因来做混合开发。Flutter也一样,但是由于它的所有界面都在同一个stack里,所以它不能够像RN一样在Android界面中间嵌入一个Flutter的控件。它提供了回调的语法,让开发者可以在Android代码中唤起Flutter界面

public class MainActivity extends FlutterActivity {....new MethodChannel(getFlutterView(), "app.channel.shared.data")      .setMethodCallHandler(new MethodChannel.MethodCallHandler() {        @Override        public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {          if (methodCall.method.contentEquals("getSharedText")) {            result.success(sharedText);            sharedText = null;          }        }      });

不过不排除以后会有混合UI的可能性,毕竟现在还是预览版。

Flutter会让Android开发失业吗

其实Android开发最担心的应该这个问题,它会取代传统的Android开发吗?就目前Flutter的情况来说可能性不大,首先它编出来的 apk非常大,因为要打包Flutter FW进去,所以即使是一个HelloWord也有30M。其次UI卡顿问题也比较明显,特别是在切换界面的时候目前的情况还不能做到跟原生一样的体验。最后因为Flutter FW的存在,想要用高级技巧来操作Android底层的话会更加困难。但是自从RN之后,越来越多的跨平台开发出现,现在Google也开始发力推出自己的平台,可以想象在未来跨平台移动开发的重要性会逐渐显现。想不被淘汰?还是要保持学习才行。