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本身最大特点还是在于跨平台
参考: