原文链接

更多教程


如果你有移动端开发经验,无论你是iOS还是Android开发者,你都可以利用现有的知识快速理解Flutter开发。 本文会通过对比双端开发和Flutter中的差异来说明。

Flutter中用 Widget 表示(iOS中的UIView)和(Android中的View)

Flutter中使用 Widget 表示双端开发中的view概念。就像双端中的view一样,它也可以包含其他的Widget部件。

区别是:

  • Flutter中当 widgets 和它们的状态被改变时,Flutter 会构建一颗新的 widgets 树。不像 UIView,由于不可变性,Flutter 的 widgets 非常轻量。
  • iOS中UIView在改变时并不会被重新创建,直到使用 setNeedsDisplay() 之后才会被重新绘制。
  • Android上View在改变时并不会被重新创建,直到调用invalidate时才会重绘。

Flutter中通过StatefulWidget更新widget状态

  • iOS和android中可以直接修改UIView或View的属性值,达到改变状态的目的
  • Flutter中通过使用StatefulWidget来修改widget状态

那么什么是StatefulWidget呢?

Fullter中有两种Widget,有状态的StatefulWidget和无状态的StatelessWidget。

  • StatefulWidget 拥有一个 State 对象来存储它的状态数据,通过改变State 对象的值来修改StatefulWidget的UI表现。
  • StatelessWidget 正如它听起来一样,是一个没有附加状态的 widget。例如在运行时不会改变的logo图片,就可以在 StatelessWidget 来表示。

举个例子将一个不可变状态的widget变成一个有状态的widget:

Text('I like Flutter!',style: TextStyle(fontWeight: FontWeight.bold),
);
复制代码

这个Text widget 并不携带其他状态。它通过传入给它的构造器的数据来渲染。当希望通过用户点击来修改这个Text的值时,可以用 StatefulWidget 包裹 Text widget,并在用户点击按钮时更新它。

class SampleApp extends StatelessWidget {// This widget is the root of your application.@overrideWidget build(BuildContext context) {return MaterialApp(title: 'Sample App',theme: ThemeData(primarySwatch: Colors.blue,),home: SampleAppPage(),);}
}class SampleAppPage extends StatefulWidget {SampleAppPage({Key key}) : super(key: key);@override_SampleAppPageState createState() => _SampleAppPageState();
}class _SampleAppPageState extends State<SampleAppPage> {// Default placeholder textString textToShow = "I Like Flutter";void _updateText() {setState(() {// update the texttextToShow = "Flutter is Awesome!";});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Sample App"),),body: Center(child: Text(textToShow)),floatingActionButton: FloatingActionButton(onPressed: _updateText,tooltip: 'Update Text',child: Icon(Icons.update),),);}
}
复制代码

Flutter中通过Widget树来绘制界面

  • iOS中通过代码或者storyboard、xib绘制界面
  • android通过XML编写布局
  • Flutter中通过Widget树来绘制界面

举个例子:在屏幕上显示一个简单的Widget并添加一些padding。

@override
Widget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text("Sample App"),),body: new Center(child: new MaterialButton(onPressed: () {},child: new Text('Hello'),padding: new EdgeInsets.only(left: 10.0, right: 10.0),),),);
}
复制代码

Flutter中如何动态添加或删除 Widget

  • 在Android中,您可以从父级控件调用addChild或removeChild以动态添加或删除View。
  • 在 iOS 中,你在父 view 中调用 addSubview() 或在子 view 中调用 removeFromSuperview() 来动态地添加或移除子 views。
  • 在Flutter中,因为widget是不可变的,所以没有addChild。可以通过改变一个bool值,然后重绘来决定是否展示某一个控件。

例如:点击按钮显示不通的widget:

代码如下:

import 'package:flutter/material.dart';void main() {runApp(new SampleApp());
}class SampleApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return new MaterialApp(title: 'Sample App',theme: new ThemeData(primarySwatch: Colors.blue,),home: new SampleAppPage(),);}
}class SampleAppPage extends StatefulWidget {SampleAppPage({Key key}) : super(key: key);@override_SampleAppPageState createState() => new _SampleAppPageState();
}class _SampleAppPageState extends State<SampleAppPage> {// Default value for togglebool toggle = true;void _toggle() {setState(() {toggle = !toggle;});}_getToggleChild() {if (toggle) {return new Text('1111111');} else {return new MaterialButton(onPressed: () {}, child: new Text('2222222'));}}@overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text("Sample App"),),body: new Center(child: _getToggleChild(),),floatingActionButton: new FloatingActionButton(onPressed: _toggle,tooltip: 'Update Text',child: new Icon(Icons.update),),);}
}
复制代码

Flutter如何使用动画

  • 在 iOS 中,你通过调用 animate(withDuration:animations:) 方法来给一个 view 创建动画。
  • 在Android中,您可以通过XML创建动画或在视图上调用.animate()。
  • 在Flutter中,使用动画库来包裹 widgets,而不是创建一个动画 widget。 在 Flutter 中,使用 AnimationController 来控制动画暂停、寻找、停止、反转动画等。 使用Animation类的扩展例如CurvedAnimation 来实现一个 interpolated 曲线。

举例: 点击右下角按钮,淡出图标:

代码:

import 'package:flutter/material.dart';void main() {runApp(new FadeAppTest());
}class FadeAppTest extends StatelessWidget {// This widget is the root of your application.@overrideWidget build(BuildContext context) {return new MaterialApp(title: 'Fade Demo',theme: new ThemeData(primarySwatch: Colors.blue,),home: new MyFadeTest(title: 'Fade Demo'),);}
}class MyFadeTest extends StatefulWidget {MyFadeTest({Key key, this.title}) : super(key: key);final String title;@override_MyFadeTest createState() => new _MyFadeTest();
}class _MyFadeTest extends State<MyFadeTest> with TickerProviderStateMixin {AnimationController controller;CurvedAnimation curve;@overridevoid initState() {controller = new AnimationController(duration: const Duration(milliseconds: 2000), vsync: this);curve = new CurvedAnimation(parent: controller, curve: Curves.easeIn);}@overrideWidget build(BuildContext context) {return new Scaffold(appBar: new AppBar(title: new Text(widget.title),),body: new Center(child: new Container(child: new FadeTransition(opacity: curve,child: new FlutterLogo(size: 100.0,)))),floatingActionButton: new FloatingActionButton(tooltip: 'Fade',child: new Icon(Icons.brush),onPressed: () {controller.forward();},),);}
}复制代码

Flutter如何绘图?

  • 在 iOS 上,你通过 CoreGraphics 来在屏幕上绘制线条和形状。
  • 在Android中,您可以使用Canvas在屏幕上绘制自定义形状。
  • 在Flutter中,CustomPaint 和 CustomPainter 这两个类来帮助你绘图。

举例:

代码

import 'package:flutter/material.dart';class SignaturePainter extends CustomPainter {SignaturePainter(this.points);final List<Offset> points;void paint(Canvas canvas, Size size) {Paint paint = new Paint()..color = Colors.black..strokeCap = StrokeCap.round..strokeWidth = 5.0;for (int i = 0; i < points.length - 1; i++) {if (points[i] != null && points[i + 1] != null)canvas.drawLine(points[i], points[i + 1], paint);}}bool shouldRepaint(SignaturePainter other) => other.points != points;
}class Signature extends StatefulWidget {SignatureState createState() => new SignatureState();
}class SignatureState extends State<Signature> {List<Offset> _points = <Offset>[];Widget build(BuildContext context) {return new Stack(children: [GestureDetector(onPanUpdate: (DragUpdateDetails details) {RenderBox referenceBox = context.findRenderObject();Offset localPosition =referenceBox.globalToLocal(details.globalPosition);setState(() {_points = new List.from(_points)..add(localPosition);});},onPanEnd: (DragEndDetails details) => _points.add(null),),CustomPaint(painter: new SignaturePainter(_points))],);}
}class DemoApp extends StatelessWidget {Widget build(BuildContext context) => new Scaffold(body: new Signature());
}void main() => runApp(new MaterialApp(home: new DemoApp()));
复制代码

Flutter如何创建自定义的 widgets?

  • iOS和android都是通过继承view来实现的。
  • Flutter是通过组合现有的widget来实现复杂的 widget。

举个例子,如果你要构建一个 CustomButton ,并在构造器中传入它的 label?那就组合 RaisedButton 和 label,而不是扩展 RaisedButton。

class CustomButton extends StatelessWidget {final String label;CustomButton(this.label);@overrideWidget build(BuildContext context) {return RaisedButton(onPressed: () {}, child: Text(label));}
}
复制代码

然后就像你使用其他任何 Flutter 的 widget 一样,使用你的 CustomButton:

@override
Widget build(BuildContext context) {return Center(child: CustomButton("Hello"),);
}
复制代码

由于篇幅过长,文章将分为多部分,请继续关注本文其他部分。

原文链接

更多教程

Flutter 对 iOS、Android(双端开发者)的快速理解(一)相关推荐

  1. android studio一个页面等待3秒跳转_Flutter 对 iOS、Android(双端开发者)的快速理解(二)

    原文链接 更多教程 Flutter怎么在不同页面之间跳转? 在 iOS 中,你可以使用管理了 view controller 栈的 UINavigationController 来在不同的 view ...

  2. 机甲Android on ios,全球首款iOS+Android双系统硬件机甲震撼上市

    原标题:全球首款iOS+Android双系统硬件机甲震撼上市 2016年7月20日,专为苹果打造的高端智能外设--机甲在北京震撼发布.这款全球首创的iOS/Android秒级切换双系统一举颠覆iOS和 ...

  3. ios android 双系统,全球首款iOS+Android双系统硬件机甲上市

    2016年7月20日,专为苹果打造的高端智能外设--机甲在北京震撼发布.这款全球首创的iOS/Android秒级切换双系统一举颠覆iOS和安卓两大系统之间的壁垒,成为今年"最酷"的 ...

  4. 梦幻诛仙linux纯端架设教程,梦幻诛仙 一键端搭建iOS安卓双端+完整后台源码+各种工具附带视频架设教程...

    游戏说明: 梦幻诛仙一键端搭建iOS安卓双端+完整后台源码+各种工具,视频架设教程 在游戏内当前聊天窗口输入  dmmhzxnb ,开启后台.  提示GM后台已开启. 在左上角Press Enter ...

  5. Thinkphp5新版聚合VIP影视APP源码 安卓/IOS苹果双端

    Thinkphp5新版聚合VIP影视APP源码 安卓/IOS苹果双端,非常棒的一款在线视频VIP解析APP,代理裂变版 下载地址:http://www.sucaihuo.com/source/1251 ...

  6. 物联网温湿度显示控制项目(网页、Android双端显示搭载linux平台网关MQTT通信)

    演示视频如下: 物联网项目案例-温湿度检测及mqtt实现控制(带双端显示) 代码资源可在我的资源中免费下载学习使用~ 资源链接:https://download.csdn.net/download/q ...

  7. Vue中的Diff算法 patch函数-简单Diff算法-双端Diff算法-快速Diff算法-当数据发生改变,视图如何更新?

    文章目录 Vue中的Diff算法 概述 前置知识 patch方法 简单Diff算法 总结 双端Diff算法 --vue2 快速Diff算法 --vue3 vue2和vue3 Diff算法的区别 当数据 ...

  8. 安卓手机运行ios教程_英雄联盟手游傻瓜安装教程,IOS/安卓双端可用!

    软件/资料获取方式在文末 正文: 前几天发哥预告了一下LOL手游上线的事,本来以为国服也会同步上线,结果也是意料之中的跳票了,让我不禁想起当年玩魔兽世界时国服万年的TBC,不过据说LOL推迟上线是怕影 ...

  9. 百度网盘不限速版正式推出,35M/S,附iOS/安卓双端下载

    感谢您抽出 .. 阅读本文 小伙伴们注意:公众号的推送机制不再按照时间前后推送了,微信公众号信息流乱序.君哥建议大家把科技毒瘤君公众号置顶(设为星标⭐),以便第一时间看到推送,非常感谢~,方法如下图: ...

最新文章

  1. Resultset获取行数和列数
  2. 数据库-设置mysql编码
  3. QT操作sqlite数据库汇总
  4. C语言中open与fopen的的解释和区别
  5. python的交互式解释器_python3.4.1解释器python交互式图形编程实例(三)
  6. C++ 标准文件的写入读出(ifstream,ofstream)
  7. SSH-远程登录协议
  8. 华为Mate 40系列开启线下预约:麒麟9000“末代”旗舰
  9. 当最后一位不能为空格_清除工作表中的空格/非打印字符?TRIM与CALEN都无法清除时怎么办...
  10. Altium AD20导出为PDF、导出BOM表
  11. [渝粤教育] 中国地质大学 测量学 复习题 (2)
  12. spring boot利用controller来测试写的类
  13. QCC蓝牙芯片PIO操作
  14. 如何把word文件转换成PDF格式?
  15. 计算机音乐模式怎么设置,电脑开机时自启QQ音乐APP播放歌曲的功能在哪里设置...
  16. 使用docker部署java服务
  17. 【推荐】1657- 灵活可扩展,2023年值得尝试的13款富文本编辑器
  18. 弱校胡策 大逃亡(BFS灌水+二分答案)
  19. centos7 搭建redis 5.0.0 集群
  20. linux实现对上传文件的定时备份、增量备份

热门文章

  1. java扫描试卷改分,电子阅卷系统方案 电脑改卷系统
  2. 微生物网络构建原理: SparCC, MENA, LSA, CoNet
  3. WMware Harbor 开源 Docker 私有库搭建
  4. python汇率转换_利用Python中的Xpath实现一个在线汇率转换器
  5. <Principles of fMRI 1>课程笔记8 信号、噪音与血流
  6. 服务器重启之后NVIDIA出现问题原因汇总
  7. linux C语言 任务优先级,C语言中设置进程优先顺序的方法
  8. PMP项目收尾阶段的常见工作
  9. oracle direct path read temp,Oracle中的direct path read事件(转)
  10. 图片处理Photoshop给广告模特专业润肤及磨皮