关于flutter组合实例的信息

Flutter是一个什么框架

Flutter是一个移动应用程序的软件开发工具包(SDK),具有以下特征:

创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、成都做网站、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的铅山网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!

跨平台应用的框架,没有使用WebView或者系统平台自带的控件,使用自身的高性能渲染引擎自绘

简化版的浏览器,最大限度在android和ios上统一UI,包括业务逻辑和用户体验

开发语言使用dart,结合C, C++, 和Skia(2D渲染引擎)构建

支持hot reload,包含着完整的控件和工具链

一切皆控件,控件是每个Flutter应用程序的基本构建块,与分离视图、控制器、布局和其他属性的框架不同,Flutter具有一致的统一对象模型:控件。一个控件可以定义:结构元素(比如按钮或菜单)、风格元素(比如字体或颜色方案)、布局的方面(比如填充)、一些业务逻辑等

组合大于继承,控件本身通常由许多小型、单用途的控件组成,结合起来产生强大的效果,类的层次结构是扁平的,以最大化可能的组合数量

强化版的WebView,框架仅提供一个View层,大部分功能要依赖原生

目前只能够运行大部分Dart代码(不能引入dart:mirrors或dart:html库)

Flutter状态管理 ChangeNotifierProxyProvider的使用

这里的DynamicHabitDetailViewModel实例对象由ChangeNotifierProxyProvider提供,ChangeNotifierProxyProvider组合了两种功能:

(1)它会自动订阅DynamicHabitDetailViewModel中的更改(如果您只想使用此功能,只需使用ChangeNotifierProvider)

(2)它采用先前提供的对象的值(在本例中为TeamDetailViewModel,如上所述),并使用它来构建DynamicHabitDetailViewModel的值(如果您只需要此功能,只需使用ProxyProvider,也就是项目中的ChangeNotifierProxyProvider)

Flutter PageView使用案例

现在的小目标是要实现一个 「图片轮播」的效果,我们在 Android 中可以使用 ViewPager 结合 handler 或者 Timer 去实现。

而我们在 Flutter 中,其实也是类似的。

那么,在 Flutter 中,代替 Android 中的 ViewPager 组件是 PageView ,而且,这个 PageView 相比 ViewPager 扩展性更高。

我们来看一下

Flutter PageView 官网

根据官网的介绍, PageView 在需要展示的页面很多时,有「控件复用」功能,而且,我们还可以通过

来设置滚动的方向,也就是说,我们还可以完成「纵向滚动」,真的很棒有么有?

偷的小米官网的轮播图

看一下效果图

GestureDetector ,或者直接返回一个 button 类型的 Widget 即可

ok,了解了这个PageView,接下来,我们想法子搞一个「轮播效果」,请见下一篇文章。

Flutter_定义控件StatefulWidgets和StatelessWidget

Stateful(有状态) 和 stateless(无状态) widgets

stateless widget 没有内部状态. Icon、 IconButton, 和Text 都是无状态widget, 他们都是 StatelessWidget的子类。

stateful widget 是动态的. 用户可以和其交互 (例如输入一个表单、 或者移动一个slider滑块),或者可以随时间改变 (也许是数据改变导致的UI更新). Checkbox, Radio, Slider, InkWell, Form, and TextField 都是 stateful widgets, 他们都是 StatefulWidget的子类。

StatefulWidget类

具有可变状态的小部件。

状态是(1)在构建窗口小部件时可以同步读取的信息,以及(2)在窗口小部件的生命周期内可能会更改的信息。这是小工具实施者的责任,以确保国家的及时通知当这种状态的改变,使用State.setState。

有状态窗口小部件是一个窗口小部件,它通过构建一个更具体地描述用户界面的其他窗口小部件来描述用户界面的一部分。构建过程以递归方式继续,直到用户界面的描述完全具体(例如,完全由RenderObjectWidget组成,其描述具体的RenderObject)。

当您描述的用户界面部分可以动态更改时(例如由于具有内部时钟驱动状态或依赖于某些系统状态),状态窗口小部件非常有用。对于仅依赖于对象本身中的配置信息以及窗口小部件膨胀的 BuildContext的组合,请考虑使用 StatelessWidget。

StatefulWidget实例本身是不可变的,并且将它们的可变状态存储在由createState方法创建的单独State对象中 ,或者存储在State订阅的对象中,例如Stream或ChangeNotifier对象,其引用存储在StatefulWidget的最终字段中本身。

框架在膨胀StatefulWidget时 调用createState,这意味着如果该窗口小部件已插入到多个位置的树中,则多个State对象可能与同一StatefulWidget关联。同样,如果StatefulWidget从树中移除,后来在树再次插入时,框架将调用createState再创建一个新的国家目标,简化的生命周期状态的对象。

如果StatefulWidget的创建者使用GlobalKey作为其 键,则StatefulWidget在从树中的一个位置移动到另一个位置时保持相同的State对象。由于具有GlobalKey的窗口小部件可以在树中的至多一个位置使用,因此使用GlobalKey的窗口小部件最多只有一个关联元素。当通过将与该窗口小部件关联的(唯一)子树从旧位置移植到新位置(而不是在该位置重新创建子树)时,框架利用此属性将全局键从树中的一个位置移动到另一个位置时利用此属性。新的位置)。与StatefulWidget关联的State对象与子树的其余部分一起被移植,这意味着State对象在新位置被重用(而不是被重新创建)。但是,为了有资格进行嫁接,必须将窗口小部件插入到从旧位置移除它的同一动画帧中的新位置。

StatefulWidget有两个主要类别。

首先是其中一个分配资源State.initState并在他们的处置State.dispose,但不依赖于InheritedWidget S或致电State.setState。这些小部件通常在应用程序或页面的根目录中使用,并通过ChangeNotifier, Stream或其他此类对象与子小部件进行通信。遵循这种模式的有状态小部件相对便宜(就CPU和GPU周期而言),因为它们构建一次然后永不更新。因此,它们可能有一些复杂和深刻的构建方法。

第二类是使用State.setState或依赖于 InheritedWidget的小部件。这些通常会在应用程序的生命周期内重建多次,因此最小化重建此类窗口小部件的影响非常重要。(他们也可以使用State.initState或 State.didChangeDependencies并分配资源,但重要的是他们重建。)

可以使用几种技术来最小化重建有状态窗口小部件的影响:

StatelessWidget类

一个不需要可变状态的小部件。

无状态窗口小部件是一个窗口小部件,它通过构建一个更具体地描述用户界面的其他窗口小部件来描述用户界面的一部分。构建过程以递归方式继续,直到用户界面的描述完全具体(例如,完全由RenderObjectWidget组成,其描述具体的RenderObject)。

当您描述的用户界面部分不依赖于对象本身的配置信息以及窗口小部件膨胀的BuildContext时,无状态窗口小部件非常有用。对于可以动态更改的组合,例如由于具有内部时钟驱动状态或依赖于某些系统状态,请考虑使用StatefulWidget。

无状态窗口小部件的构建方法通常仅在以下三种情况下调用:第一次将窗口小部件插入树中,窗口小部件的父窗口更改其配置时,以及何时依赖于更改的InheritedWidget。

如果窗口小部件的父级将定期更改窗口小部件的配置,或者它依赖于经常更改的继承窗口小部件,则优化构建方法的性能以保持流畅的呈现性能非常重要。

可以使用几种技术来最小化重建无状态窗口小部件的影响:

Flutter(六)Android与Flutter混合开发(Hybird)

如果我们目前的项目是Android的,但是接下来我们希望部分页面可以使用Flutter进行开发,甚至我们希望在Native页面中嵌入FlutterUI组件,那么我们该如何实现呢?

假设你现在Android项目的目录的结构是这样的

这时候如果你想创建一个Flutter模块,使得Android模块和Flutter模块之间可以进行交互,我们可以通过Android Studio新建一个Flutter Module,具体过程是:File — New — New Module ,之后选择Flutter Module,指定Project Location的路径为

也就是说,最终你的项目结构会是这样的

接下来在Android Module的 build.gradle 文件中添加flutter依赖

先创建一个Flutter页面

这里比较重要的是 window.defaultRouteName 这个字段,这个字段可以接收从Native传递过来的参数 (下文我们会介绍原生传递参数的方法),也就是说通过这个字段我们就可以进行Flutter页面的路由的分发

我们可以直接在Android的 MainActivity 中启动一个 FlutterActivity ,这里的 initialRoute 方法中传递的参数就对应Flutter层的 window.defaultRouteName

注意:需要在 AndroidManifest.xml 注册 FlutterActivity

自己创建一个 FlutterAppActivity 继承自 FlutterActivity

在 MainActivity 中启动 FlutterAppActivity (另外别忘了在 AndroidManifest.xml 中注册 FlutterAppActivity )

两种启动方式的区别

如果单纯只是想打开一个Flutter页面,两种方式实际上基本没有太大区别,第一种方式也许还会更简单一点。但是,在Flutter开发中,我们往往还需要开发一些Native插件供Flutter调用,如果使用复写 FlutterActivity 的方式更有利于我们在 FlutterActivity 中注册我们的Native插件,所以实际开发中一般推荐使用第二种方式

扩展思考

initialRoute 从名称上看起来是Flutter提供给我们进行Native与Flutter交互的路由跳转的,但是实际上他就是一个字符串,我们不仅仅可以传递一个路由名称,有时候我们也可以通过这个参数传递一串JSON数据,然后在Flutter端进行解析,这样我们就可以通过这个参数做更多的事情

activity_main.xml

FrameLayout 用于承载Flutter组件

MainActivity.java

使用 FragmentManager 将 FlutterFragment 添加到 FrameLayout 容器中

运行结果

上半部分是原生的TextView,下半部分是Flutter的Text组件

本节主要介绍了Native和Flutter之间的页面跳转,以及同一个页面中Native与Flutter组件的组合。接下来会介绍如何编写Android插件与Flutter进行数据交互

Flutter 6种构造函数详解

Flutter有生成构造函数、默认构造函数、命名构造函数、重定向构造函数、常量构造函数、工厂构造函数

生成构造函数是最常见的构造函数,即生成实体类对象。

如果未声明构造函数,则会提供默认构造函数。 默认构造函数没有参数,并调用父类无参数构造函数。

默认情况下,子类中的构造函数调用父类的未命名无参数构造函数。 父类的构造函数在子类构造函数体的开头被调用。 如果还使用初始化了列表,则会在调用父类构造函数之前执行。 执行顺序如下:

如果父类没有未命名的无参数构造函数,则必须手动调用父类中的一个构造函数。 在子类的构造函数体之后用冒号(:)指定父类构造函数

当需要定义一个有特别含义的构造函数的时候,可以通过命名构造 形式:构造函数.XXX来命名构造函数

有时构造函数需要重定向到同一个类中的另一个构造函数,在冒号后面用this:

如果你的类需要成为永远不会更改的对象,则可以使这些对象成为编译时常量。 定义const构造函数要确保所有实例变量都是final。

不用直接创建对象(可以通过调用其他构造函数创建)


分享标题:关于flutter组合实例的信息
浏览地址:http://scyanting.com/article/dssjjcj.html