Flutter调研(3)-demo编写与小结
一个demo
一、关于Dart语言
在查看代码之前,首先我们来了解下Dart语言,Flutter在应用层使用Dart进行开发,而支撑它的是用C++开发的引擎
Dart的设计综合借鉴了Java和JavaScript,在静态语法方面与Java相似,如类型定义、函数声明和泛型等,在动态特性上比如函数式特性、异步支持。
- Dart是一种面向对象的语言
- Dart是一种强类型语言
- Dart有GC机制
- Dart在运行之前会先解析代码
- Dart中,Object类是所有对象的根基类
- Dart的异步支持基于类似于JS的“Future返回结果”和“
async
方法和await
表达式” - Dart没有作用域关键字,如果标识符以_开头表示该方法或者属性为类私有
- Dart是单线程的
二、关于Widget
Flutter Widget采用现代响应式框架构建,中心思想是用widget构建你的UI。
Widget可以译为组件之类的,描述当前视图在当前的配置和状态时的展示形态,当Widget的状态发生改变时,UI会被重新构建,Flutter会对比前后变化的不同,以确定底层渲染树从一个状态转换到下一个状态所需的最小更改;这个思路和React有一定相似。
基于以上,那么就有两个父类,无状态的StatelessWidget和有状态的StatefulWidget,这两个抽象类时直接集成自Widget类,日常使用中比较常用。
StatelessWidget
用于不需要维护状态的场景,无状态组件不可变,通过build方法构建页面;StatefulWidget用于有状态变化的场景,
createState()
用于创建与Stateful widget对应的一个继承State类的子类,在State类中调用build方法构建页面
三、代码:demo
// main.dart import ‘package:flutter/material.dart‘; //导入Material的UI组件库,来自谷歌,使展示更鲜明 import ‘home.dart‘; void main() => runApp(MyApp());// 程序的入口,调用runApp()启动程序, "=>"是单行方法的简写 class MyApp extends StatelessWidget { // MyApp是一个继承于无状态statelessWidget的类 @override Widget build(BuildContext context) {//调用build方法构建UI界面 return MaterialApp( // 代表Material设计风格的应用,也是一个Widget,可定义应用名称,主题,首页 title: ‘Flutter Demo mfw‘,// 任务管理窗口所展示的应用名称 theme: ThemeData( //应用的主题颜色 primarySwatch: Colors.blue, ), home: Home(title: ‘Flutter Demo Home Page‘),//应用默认所要展示的界面 ); } } // home.dart:一个计数器,三个跳转路由 class Home extends StatefulWidget { Home({Key key, this.title}) : super(key: key); final String title; @override _HomeState createState() => _HomeState(); } class _HomeState extends State<Home> { int _counter = 0; void _incrementCounter() {// 监控按钮的增加数值方法 setState(() {//通知Flutter框架有状态改变,Flutter框架收到通知后,会执行build方法重新构建界面 _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text( ‘You have clicked the button this many times:‘, ), Text( ‘$_counter‘, style: Theme.of(context).textTheme.display1, ), FlatButton( child: Text("open new case1"), textColor: Colors.blue, onPressed: (){ Navigator.push( context, MaterialPageRoute(builder: (context){ return NewRoute(); })); }, ), FlatButton( child: Text("open new case2"), textColor: Colors.blue, onPressed: (){ Navigator.push( context, MaterialPageRoute(builder: (context){ return NewRoute1(); })); }, ), FlatButton( child: Text("open new case3"), textColor: Colors.blue, onPressed: (){ Navigator.push( context, MaterialPageRoute(builder: (context){ return Route3(); })); }, ) ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: ‘Increment‘, child: Icon(Icons.add), ), ); } } |
一个小结
一、测试期间可能遇到的问题
1、Widget嵌套可能导致的问题
2、由于单线程机制,Flutter本身不会导致crash,会卡顿
3、UI溢出的报错,提示overflow
4、由于状态管理有些笨重,动画效果的实现需要注意
5、原生与flutter之间的互相跳转需要注意,与原生权限获取时是否有问题
二、code方面的简单总结
// 每个widget继承自StatelessWidget或者StatefuleWidegt // statelessWidget状态变化不大,statefulWidget分成两个,一个有build构建方法,一个继承自state类 // 一个标准statelessWidget的Widget构建过程如下 class TestWidget extends StatelessWidegt{ @override Widget build(BuildContext context){// build页面 return 控件名( xxxx(child:内嵌其他控件 ), ..... ) } }; // 那么一个statefulWidget的构建过程 class Test extends StatefulWideget{ Route3({Key key}) : super(key: key); @override _TestState createState() => _TestState(); //新建state类 } class _Route3State extends State(Test){ @override Widget build(BuildContext context)// 在state类里build页面 .... } |
三、讲解问题记录
1、flutter实现跨平台的原理是什么
Flutter跨平台最核心的部分,是它的高性能渲染引擎(Flutter Engine)。Flutter不使用浏览器技术,也不使用Native的原生控件,它使用自己的渲染引擎来绘制widget。
对于Android平台,Flutter引擎的C/C++代码是由NDK编译,在iOS平台,则是由LLVM编译,两个平台的Dart代码都是AOT编译为本地代码,Flutter应用程序使用本机指令集运行。
Flutter正是是通过使用相同的渲染器、框架和一组widget,来同时构建iOS和Android应用,而无需维护两套独立的代码库。
2、flutter的性能如何
通过资料查询,原生在内存和CPU资源等性能方面,原生是要优于flutter的,flutter本身最大特点还是在于跨平台
参考: