重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一个特定大小的盒子。这个widget给予子控件宽度和高度。如果宽度或高度为null,则此widget将调整自身大小以匹配子控件的大小。
专注于为中小企业提供网站制作、成都网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业清流免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了数千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
尽可能大的在父控件的约束内显示
尽可能小的在父控件的约束内显示
以Size尺寸约束
下一节:Layout组件之Transform
在用Flutter 开发windows和linux跨平台应用的时候,如何设置默认窗口大小呢?
flutter没有提供统一的api,所以默认的窗口大小是1280x720.
如果我们想要改成自己想要的默认窗口大小呢?比如我想要设置为:512像素宽, 926像素高
我该怎么做呢?
请看我的教程。
首先你确保你已经为项目创建了windows和Linux的支持。
目前Flutter 为windows和linux提供的是托管式运行的主程序,可以理解为一个壳子,这个壳子就是用cpp写的,平台原生的window 窗口。
所以我们可以打开相应的cpp源代码,设置默认窗口大小。
这里先讲windows和linux,因为mac 平台跟windows和linux不一样,后面单独给大家讲解。
我们看图。
源代码路径位于:
windows/runner/main.cpp
找到
第一个参数是宽度,单位是px,第二个是高度,单位是px
修改后重新运行生效。
源代码路径位于:
linux/my_application.cc
找到
方法的第一个数字是宽度,第二个是高度,单位也是px像素。
修改后,重新运行生效。
现在,你已经学会了如何设置初始窗口大小了。
SliverAppBar 控件,一个 MD 的 AppBar 。属性和 AppBar 类似,但做的效果比 AppBar 更加强大。相同的属性具体可以看 Flutter 之 Scaffold 控件 , 里面有 AppBar 控件的介绍。那么还有些没有的属性:
结合 elevation 使用,当elevation 不为 0 的时候,是否显示阴影
AppBar 展开时候的高度
true 的时候下滑AppBar优先滑动展示,展示完成后才给滑动控件滑动
snap 为 true, 则 floating 也要为 true 。true 的时候根据手指松开的位置展开或者收缩AppBar
appBar 收缩到最小高度的时候 appBar 是否可见
SliverAppBar 往往做为 CustomScrollView 的第一个子元素,根据滚动控件的偏移量或者浮动的位置来改变 SliverAppBar 的高度。所以具体用法如下
另外在上面设计到 FlexibleSpaceBar 控件,FlexibleSpaceBar 有个 collapseMode 属性
为 Sliver 系列控件添加一个 padding 。如给上面 SliverAppBar 添加一个 Padding 。
多行多列的列表控件,相当于 Android 的 GridView,有两个属性
SliverChildDelegate,这里有两种方式创建
SliverGridDelegate,也是有两种方式创建
结合上面展示效果
和上面 delegate 属性一样,需要创建一个 SliverChildDelegate 。
比 SliverList 多一个 itemExtent 属性,设置 item 的高度 。item 里面的子控件无法再改动高度。
上面 SliverAppBar 就是结合 SliverPersistentHeader 实现的效果,SliverPersistentHeader 需要一个 SliverPersistentHeaderDelegate 。 实现 SliverPersistentHeaderDelegate 有 4 个方法需要重写
至于效果,具体效果具体分析。
有一个 Widget 属性,主要作用是在 CustomScrollView 里面添加多种不同布局的样式。
占满一屏或者比一屏更多的布局,
滑动剩余部分展示的布局
Flutter中给我们预先定义好了一些按钮控件给我们用,常用的按钮如下
我们先来看看MaterialButton中的属性,可以看到能设置的属性还是很多的。
下面我们来看看常用属性
而在Android中如果我们要修改按钮样式的话,需要通过selector和Shape等方式进行修改,相比较Flutter来说是要麻烦不少的
RaisedButton的构造方法如下,由于继承自MaterialButton,所以MaterialButton中的大多数属性这边都能用,且效果一致,这里就不在赘述了
下面我们来看一下属性
接收一个方法,点击按钮时回调该方法。如果传null,则表示按钮禁用
如下图所示
按钮文本控件,一般都是传一个Text Widget
按钮颜色
按钮的文本颜色
点击按钮时水波纹颜色
高亮颜色,点击(长按)按钮后的颜色
阴影范围,一般不会设置太大
内边距,使用
或者
shape用来设置按钮的形状,其接收值是ShapeBorder类型,ShapeBorder是一个抽象类,我们来看看有哪些实现类
可以看到,实现类还是很多的,我们主要来看看常用的即可。
borderRadius 接收一个BorderRadius类型的值,常用方法如下
我们可以把borderRadius分为上下左右四个方向,下面的方法都是对这四个方向进行设置,
带斜角的长方形边框
圆形边框
圆角矩形
两端是半圆的边框
FlatButton跟RaisedButton用法基本一致,下面我们就直接用一下
注意,OutlineButton是一个有默认边线且背景透明的按钮,也就是说我们设置其边线和颜色是无效的,其他属性跟MaterialButton中属性基本一致
下面我们直接来使用
效果如下:
IconButton是直接继承自StatelessWidget的,默认没有背景
我们来看一下他的构造方法
可以看到,icon是必填参数
icon接收一个Widget,但是一般我们都是传入一个Icon Widget
其他属性跟MaterialButton中的属性用法基本一致
我们来用一下
效果如下:
我们也可以传一个Text或其他Widget,这个大家自行尝试吧
如果我们需要设置按钮的最小宽度以及高度,button属性中并没有提供对应的设置方法
使用如下:
Flutter中Button内容大概就是这些
记录下自己踩过的坑,怕忘了
一.TextField:
1.去掉输入数字的计数:decoration中的counterStyle: TextStyle(color: Colors.transparent).
2.去掉获取和失去焦点时边框改变颜色的效果:decoration内border: InputBorder.none,
3.去边框时设置BorderSide的width为0或color: Colors.transparent后依然存在边框时,需要设置为borderSide: BorderSide.none
4.设置背景色需要在decoration内 filled:true, fillColor: Colors.blue同时设置才会显示
二.Uint8List类型和string类型,Listint的转换
连续两次base64解码时,参数只能使用string类型,但是base64解码后是Uint8List类型,此时需要将Uint8List类型转换为string类型,使用:utf8.decode(Uint8List)即可,需要import 'dart:convert';
Listint转Uint8List:读取接口时获取的数据是Listint的图片数据,想显示时需要转成Uint8List,然后使用Image.memory(),使用:Uint8List.fromList(Listint)即可
三.报错:DioError [DioErrorType.DEFAULT]: FormatException: Unexpected character (at character 1)MGFlMFo0NEZ3RWNMbE5YbGNGOXZGcUlJdUhIS2x2Q3NlckxqWXlEeG5JWndZdXIrSUpLN3ZOczR...
这是因为dio请求返回的数据默认是以json的格式读取的,而返回的数据是密文形式,需要修改dio的Options的responseType为ResponseType.PLAIN,这样返回的数据就以字符串形式处理.
四.去掉点击控件背景出现的水波纹效果,即去掉md的效果:
在main.dart的MaterialApp内的theme加上splashColor: Colors.transparent
五.布局去掉沉浸式效果和布局设置占满全屏却无效的问题
使用Scaffold的body的布局默认是沉浸式的,将状态栏一起包含了,可以通过在body后添加一层SafeArea即可.
布局设置double.infinity占满全屏高度却无效,大部分情况都是因为某一级的父布局的高度已经有了限制,所以设置充满屏幕只会充满父布局,有些widget默认是按内容填充类似wrap_content就会导致写布局的过程中自己没有限制高度但最后的布局不是自己想要的,可以给各个父布局设置不同背景颜色来查看是从哪儿开始被限制了高度来排查问题.
六.占满剩余空间,类似android的match_parent可以使用double.infinity
七.LinearProgressIndicator
1.LinearProgressIndicator设置进度值的颜色为单一颜色:valueColor : new AlwaysStoppedAnimation(Color(JColor.blue))
2.给LinearProgressIndicator设置圆角:ClipRRect(
borderRadius:BorderRadius.circular(60.0),
child:LinearProgressIndicator(value:0.2,backgroundColor:Color(JColor.grayBg),valueColor:new AlwaysStoppedAnimation(Color(JColor.blue)),
)
八.Expanded:
1.若嵌套多层column且内容的高度都不确定需要占满剩余空间,需要每层的column的内容都嵌套一层expanded来申明每层都占满剩余的空间,否则最里面的内容层需要指定高度,不然会报错
九.Container设置最小/大宽度或高度:
constraints:BoxConstraints(minHeight:56),
十.滑动的widget嵌套:
1.解决滑动冲突:内层嵌套的滑动widget设置physics:NeverScrollableScrollPhysics()
2.解决滑动嵌套ui显示不出来或者报错,内层的滑动widget设置shrinkWrap:true
十一.使用multi_image_picker: ^4.3.4安卓运行报错Didn't find class "com.sangcomz.fishbun.FishBunFileProvider"
1.需要android工程支持androidx,需要在android工程的gradle.properties内添加android.enableJetifier=true和android.useAndroidX=true并点击右上角的open for editing in android studio,运行成功后就可以了
十二.使用textfield时的文字ui总是很高
使用了maxlength且只是在textfield的InputDecoration设置counterStyle的颜色为透明使下面的计数文字消失会导致文字ui很高,counter的计数文字只是颜色是透明但依然在布局中占了位置所以导致文字很高,直接使用counterText:""即可
十三.使用ListView报错Vertical viewport was given unbounded height
需要将ListView放入Expanded内部