mryangjx 2020-03-01
在查看代码之前,首先我们来了解下Dart语言,Flutter在应用层使用Dart进行开发,而支撑它的是用C++开发的引擎
Dart的设计综合借鉴了Java和JavaScript,在静态语法方面与Java相似,如类型定义、函数声明和泛型等,在动态特性上比如函数式特性、异步支持。
async 方法和 await 表达式”Flutter Widget采用现代响应式框架构建,中心思想是用widget构建你的UI。
Widget可以译为组件之类的,描述当前视图在当前的配置和状态时的展示形态,当Widget的状态发生改变时,UI会被重新构建,Flutter会对比前后变化的不同,以确定底层渲染树从一个状态转换到下一个状态所需的最小更改;这个思路和React有一定相似。
基于以上,那么就有两个父类,无状态的StatelessWidget和有状态的StatefulWidget,这两个抽象类时直接集成自Widget类,日常使用中比较常用。
StatelessWidget用于不需要维护状态的场景,无状态组件不可变,通过build方法构建页面;
StatefulWidget用于有状态变化的场景,createState() 用于创建与Stateful widget对应的一个继承State类的子类,在State类中调用build方法构建页面
// 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之间的互相跳转需要注意,与原生权限获取时是否有问题
// 每个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本身最大特点还是在于跨平台
参考: