Flutter学习总结

从今年五月一之后就开始学习Flutter了,接触到Flutter之后,才发现Flutter的方便,强大;api对开发者来说真是太友好了,断断续续学了一个月后,对FLutter有了一定得了解,总结了一些心得体会;这边总结存放许久,今天发出来记录一下,以防丢失,方便自己以后查看复习。

#Widget  everything is widget

StateLessWidget 无状态Widget  build();构建展示页面 ,

StatefulWidget 有状态Widget,

lifecycle:

//the lifecycle of [State]

enum _StateLifecycle {

created,->State.initState() 当前页面被添加时被调用

initialized,->State.didChangeDependencies() 当前页面的初始化

State.deactivate()准备移除当前页面

ready,

State.dispose()当前页面被移除

defunct,

}

其他:didUpdateWidget()有新widget被添加,热重载时调用, setState()更新页面数据 ->build()构建展示页面 ,

#Scaffold    ##demos/LayoutApp.dart

Scaffold :脚手架,相当于Android的Activity,Fragment,实现基本材料设计视觉布局结构。

bottomNavigationBar:底部导航栏

###在Android上:该应用导航到目标的顶级屏幕。重置任何先前的用户交互和临时屏幕状态,例如滚动位置,选项卡选择和内联搜索。

在iOS上(CupertinoTabBar):目的地反映了用户之前的互动。如果用户先前访问过应用程序的该部分,则会返回到查看的最后一个屏幕(如果可能,保留其先前状态)。否则,应用程序会导航到顶级屏幕。

floatingActionButton:悬浮按钮

drawer:左边抽屉

endDrawer:右边抽屉

bottomSheet:底部提示抽屉(静态,不可消失)

appBar:标题栏

##demos/tab/TabBar.dart

TabBar 一个显示水平选项卡的Material Design widget。

TabBarView 显示与当前选中的选项卡相对应的页面视图。通常和TabBar一起使用。

#Container  ##demos/container/ContainerDemos.dart

相当于Android里的LinearLayout

Row 行 在水平方向上排列子widget的列表

Column 列 在垂直方向上排列子widget的列表。

Stack 可以允许其子widget简单的堆叠在一起 (Android FrameLayout)

Container 一个拥有绘制、定位、调整大小的 Widget容器,本身也是Widget

Center 将其子widget居中显示在自身内部的widget

Wrap 包括容器

Card 带阴影,圆角的容器

Padding 一个widget, 会给其子widget添加指定的填充

#Widgets Button:  ##demos/LayoutApp.dart

RaiseButton: Material :Design中的button, 一个凸起的材质矩形按钮  (相当于一个有点击事件的容器,一般包含一个Text child,onPressed 处理点击事件,)

FlatButton,一个没有阴影的材质设计按钮。(一般只有文案,用于Dialog对话框底部按钮)

IconButton,用于创建仅包含图标的按钮。(跟 RaiseButton有点类似,只是child换成了icon图标)

DropdownButton,一个显示可供选择的选项的按钮。(能弹出一个类似Dialog样式的弹窗)

InkWell,实现平面按钮的墨水飞溅部分。(用法较麻烦,效果不是很明显)

FloatingActionButton,材质应用程序中的圆形按钮。(悬浮按钮,优先级别较大,一般用于BottomBar上,或者主页上,作为比较重要的逻辑入口)

#国际化  ## demos/international/International.dart

#resources 资源 demos/res/Resources.dart

pubspec.yaml文件中声明 assets: - images/**.jpg ; assets: - images/这种声明只适合1.0中有的文件

pubspec.yaml 文件 声明的资源都会被打包到apk中

#自定义字体  demos/res/Resources.dart

#输入框 demo/input_select_widgets/InputSelectBox.dart

TextField :文本字段允许用户输入文本,可以使用硬件键盘,也可以使用屏幕键盘。

#选择框 demo/input_select_widgets/InputSelectBox.dart

CheckBox:复选框,允许用户从一组中选择多个选项。(不带文字,图标描述)

CheckboxListTile:它将此小部件与ListTile结合使用,以便您可以为复选框指定标签。(带文字,图标描述)

##demo/input_select_widgets/InputSelectBox.dart

Radio:单选框,允许用户从一组中选择一个选项。(不带文字,图标描述)

RadioListTile:它将此小部件与ListTile结合使用,以便您可以为单选按钮指定标签。(带文字,图标描述)

##demo/input_select_widgets/InputSelectBox.dart

Switch :On/off 用于切换一个单一状态(不带文字,图标描述)

SwitchListTile,它将此小部件与ListTile结合使用,以便为交换机提供标签。(带文字,图标描述)

##demo/input_select_widgets/InputSelectBox.dart

Slider:滑块,允许用户通过滑动滑块来从一系列值中选择。

Date & Time Pickers:日期&时间选择器

#Dialog  demo/dialog/Dialog.dart

SimpleDialog :简单对话框可以显示附加的提示或操作

AlertDialog :一个会中断用户操作的对话款,需要用户确认

BottomSheet:是一个从屏幕底部滑起的列表(以显示更多的内容)。你可以调用showBottomSheet()或showModalBottomSheet弹出

ExpansionPanel:扩展面板包含创建流,允许对元素进行轻量级编辑。expanpanel与ExpansionPanelList结合使用。

SnackBar : 具有可选操作的轻量级消息提示,在屏幕的底部显示。

#标签, ## demo/message_widget/MessageWidget.dart

Chip:一个Material widget。 它可以将一个复杂内容实体展现在一个小块中,如联系人。

InputChip:一种芯片,以紧凑的形式表示复杂的信息,例如实体(人,地方或事物)或会话文本。

ChoiceChip:允许从一组选项中进行单一选择。选择芯片包含相关的描述性文本或类别

## demo/message_widget/MessageWidget.dart

LinearProgressIndicator:线性进度条,

CircularProgressIndicator:圆形进度条

## demo/message_widget/MessageWidget.dart

Stepper:一个Material Design 步骤指示器,显示一系列步骤的过程

inputChip:

演示视频 :https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F12UiMVkjIJrWLKyDljDbbSgJQSuTs5vZR%2Fentry-chip-behavior-editable.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1UpLaNgayWmHV8gIGOybjBMGXfsm2KrU2%2Fentry-chip-behavior-expandable.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1yP4gEV5gaomMWK30xoTCO3mSPFwvi7Wv%2Fentry-chip-behavior-draggable.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1fa62nXcCK1CgMTZ28nE0KfE-vkH1aHsm%2Fentry-chip-placement-scrolling.mp4

https://storage.googleapis.com/spec-host-backup/mio-design%2Fassets%2F1fD_fhRHOQl0yc9BtWmzPbtj3gU9qFG4s%2Fentry-chip-behavior-stackable.png

##############################################################################################################################################

Flutter 进阶总结

1.bottomNavigationBar:底部导航栏

###在Android上:该应用导航到目标的顶级屏幕。重置任何先前的用户交互和临时屏幕状态,例如滚动位置,选项卡选择和内联搜索。

在iOS上(CupertinoTabBar):目的地反映了用户之前的互动。如果用户先前访问过应用程序的该部分,则会返回到查看的最后一个屏幕(如果可能,保留其先前状态)。否则,应用程序会导航到顶级屏幕。

#IndexedStack

# 可以用OffStage控件解决 用法见    lib/youluedu/NavigationBottomBar.dart

Offstage的布局行为完全取决于其offstage参数

## Offstage的作用很简单,通过一个参数,来控制child是否显示,日常使用中也算是比较常用的控件。

当offstage为true,当前控件不会被绘制在屏幕上,不会响应点击事件,也不会占用空间;

当offstage为false,当前控件则跟平常用的控件一样渲染绘制;

***另外,当Offstage不可见的时候,如果child有动画,应该手动停掉,Offstage并不会停掉动画。

2.开屏页空白

# 官网在android/app/res/values/styles中提供了LaunchTheme主题支持,在清单文件中,设置在MainActivity上,

##LaunchTheme


Flutter draws its first frame -->

@drawable/launch_background

## launch_background

android:gravity="center"

android:src="@mipmap/lake" />

3.    RefreshIndicator

## RefreshIndicator(

notificationPredicate: (scrollNotification){

print('----------------depth = ${scrollNotification.depth}');

return scrollNotification.depth==0;

},

semanticsLabel: 'seman label',

semanticsValue: 'seman value',

color: Colors.lightBlueAccent,

backgroundColor: Colors.redAccent,

child: ListView(...)

);

4.WillPopScope

##注册一个回调函数,以否决用户试图取消所附内容的尝试

###简单理解:就是在退出页面前,需要做的一些逻辑(表单数据未保存提醒,连续按两次返回键程序退出)

####系统控件  自动实现

WillPopScope({

Key key,

@required this.child,//child是页面具体内容Widget

@required this.onWillPop,//是一个(){}无参回调函数,做逻辑处理,返回false不退出,返回true退出

}) : assert(child != null)

#### 手动注册方式实现(下面这一套代码复制到页面就行)  eg:注意是在当前页面,不是跳转页

ModalRoute _route;

Future callBack() async{ return true;  }

@override

void didChangeDependencies() {

super.didChangeDependencies();

_route?.removeScopedWillPopCallback(callBack);

_route = ModalRoute.of(context);

_route.addScopedWillPopCallback(callBack);

}

@override

void dispose() {

_route.removeScopedWillPopCallback(callBack);

_route = null;

super.dispose();

}

5. flutter隐藏状态栏,

SystemChrome.setEnabledSystemUIOverlays([]);

6.Redux

#Action : 区分要操作的逻辑分类(一般是 enum 类型 )

#StoreProvider :包装你的MaterialApp或WidgetsApp。这将确保所有路由都可以访问

##StoreConnector : 将存储连接到呈现当前计数的文本小部件,为您的小部件构建一个专门的' ViewModel '(而不是遍历整个[Store])

##StoreBuilder :通过直接将[Store]传递给Build函数来构建小部件。将整个Store对象传过去,并且不需要初始化后的Store变量

# T xxxReducer(T state, dynamic action) :当State状态变化时候的回调函数,它会通知StoreProvider去通过热重载更新最新数据(不是重新走build函数,重建页面),

# store.dispatch(Actions):响应相关动作,更新数据(发送更新数据通知给  reducer 函数)

总结:每次按下按钮挥着数据更新,就会发出一个动作并通过reducer运行。在reducer更新状态之后,小部件将自动使用最新的计数重新构建(热重载)

7.  webview_flutter

## WebView

initialUrl:初始加载url

javascriptMode:控制javaScript开关

onWebViewCreated:webView创建后的回调

javascriptChannels:与WebView交互的函数集合

navigationDelegate:如何处理导航操作(加载URL之前拦截处理)

onPageFinished:页面加载完后的回调

### WebViewController 控制WebView页面的控制器

loadUrl() : 加载Url页面

reload() :刷新

goBack():返回

goForward():前进

clearCache():清除缓存

......

8. FutureBuilder 基于与[Future]交互的最新snapshot(数据)构建自身的小部件。继承StatefulWidget

用途:在做一个耗时异步请求时,可以根据不同的状态构建不同的Widget,eg:网络请求,请求时展示等待Progress,结束时返回想要构建的界面

future:异步操作对象Future类型,

builder:(context, AsyncSnapshot snapshot) {

snapshot:

snapshot.connectionState:枚举类

enum ConnectionState {

//future还未执行的快照状态

none,

//连接到一个异步操作,并且等待交互,一般在这种状态的时候,我们可以加载个菊花

waiting,

//连接到一个活跃的操作,比如stream流,会不断地返回值,并还没有结束,一般也是可以加载个菊花

active,

//异步操作执行结束,一般在这里可以去拿取异步操作执行的结果,并显示相应的布局

done,

}

snapshot.data ;拿到请求到的数据model

snapshot.error://错误信息

}

9.SliverList

other:

##Share (plugin),发送文件,不是分享,只是发出去一个Action,吊起系统的文件发送界面

##EventBus (plugin),轻量级页面间通讯,(比自己实现callBack简单,比Redux效率高)

由于编写的Demo含有公司的部分信息,不方便发出来,后期会做些修改分享出来;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容