1.基于Dio的网络请求快速生成器
2.
https://xuyisheng.top/riverpod3/
1.问题
Bundle始终达不到程序中
1.Ip占用情况
sudo lsof -i tcp:8087
2.ip从localhost改为127.0.0.1
3.wireshark使用
安装完后首先进入第一个界面,选择要抓包的网卡,我这里用的是wifi,所以选WLAN2,下面的Adapter for loopback…是自身回环信息的抓包,抓的是访问到自己本机的数据包
查看插件的依赖
flutter pub deps
出现问题,微信的插件依赖报错
最后采用pod repo update 。。。
发视频的时候同时截取一张图片作为封面上传
flutter 布局介绍
Container
alignment Alignment 控制child的对齐方式,如果container或者container父节点尺寸大于child的尺寸,这个属性设置会起作用,有很多种对齐方式。
padding EdgeInsets decoration内部的空白区域,如果有child的话,child位于padding内部。padding与margin的不同之处在于,padding是包含在content内,而margin则是外部边界,设置点击事件的话,padding区域会响应,而margin区域不会响应。
color Color 用来设置container背景色,如果foregroundDecoration设置的话,可能会遮盖color效果
decoration BoxDecoration 边框、圆角、渐变、阴影、 背景图片,绘制在child后面的装饰,设置了decoration的话,就不能设置color属性,否则会报错,此时应该在decoration中进行颜色的设置。
foregroundDecoration BoxDecoration 绘制在child前面的装饰。如果设置decoration, 此时foregroundDecoration 样式会叠加在decoration样式上边
width double container的宽度,设置为double.infinity可以强制在宽度上撑满,不设置,则根据child和父节点两者一起布局。
height double container的高度,设置为double.infinity可以强制在高度上撑满。
constraints BoxConstraints maxHeight、 maxWidth、 minHeight、 minWidth 添加到child上额外的约束条件。
margin EdgeInsets 外边距
transform Matrix4 动画、平移-translate、 旋转- rotation、 缩放 - scale、 斜切-skew)
Row Row意为水平布局
Column Column意为垂直布局
mainAxisAlignment MainAxisAlignment 主轴对齐方式
crossAxisAlignment CrossAxisAlignment 交叉轴对齐方式
children Widget 声明子组件
mainAxisSize MainAxisSize 表示 Row 在主轴(水平)方向占用的空间,默认是 MainAxisSize.max,表示尽可能多的占用水平方向的空间,此时无论子 widgets 实际占用多少水平空间,Row 的宽度始终等于水平方向的最大宽度。
textDirection TextDirection 子控件排序方向 (一般不用设置,除非想反转子控件排序)
textBaseline TextBaseline 对齐文本的水平线
verticalDirection VerticalDirection 对齐方式
Flex 弹性布局
direction Axis 设置主轴方向,可设置的值为 Axis.horizontal(水平方向) 和 Axis.vertical(垂直方向),交叉轴与主轴方向垂直。
mainAxisAlignment MainAxisAlignment 声明主轴对齐方式
textDirection TextDirection 声明水平方向的排列顺序
crossAxisAlignment CrossAxisAlignment 声明交叉轴对齐方式
verticalDirection VerticalDirection 声明垂直方向的排列方式
children Widget 声明子组件
Expanded(必须在 Row、Column 或 Flex 及其子类中使用。控制位于 Row、Column 或 Flex 组件的权重)
[Spacer],按 flex 大小使用空格填充空间。
[Flexible],在 Flex 中使用,包裹子组件只会按自身大小占满部分剩余空间;(同 Expanded 对比,不会占满剩余所有空间大小)
流式布局
Wrap
spacing double 主轴方向子组件的间距
alignment WrapAlignment 主轴方向的对齐方式
runSpacing double 纵轴方向子组件的间距
runAlignment WrapAlignment 纵轴方向的对齐方式
层叠布局 Stack Positioned
alignment:此参数表示如果我们没有定位子部件或者子部件只进行了部分定位时的对齐方式;
textDirection:和Row的textDirection功能一样,都用于确定alignment对齐时的参考系;
fix:用来确定没有定位的子部件如何适应Stack的大小;
overflow:用来决定如何显示超出了Stack显示区域的子部件;
Card
child Widget 声明子组件
color Colors 颜色
shadowColor Colors 阴影色
elevation double 阴影高度
shape RoundedRectangleBorder 边框样式
margin EdgeInsets 外边距
// 调试布局重点代码
debugPaintSizeEnabled=true;
import ‘package:math’ as mymath;
Part
有的时候一个库可能太大,不能方便的保存在一个文件当中。Dart允许我们把一个库拆分成一个或者多个较小的part组件。或者我们想让某一些库共享它们的私有对象的时候,我们需要使用part。
Part与import有什么区别
可见性:
如果说在A库中import了B库,A库对B库是不可见的,也就是说B库是无法知道A库的存在的。而part的作用是将一个库拆分成较小的组件。两个或多个part共同构成了一个库,它们彼此之间是知道互相的存在的。
作用域:import不会完全共享作用域,而part之间是完全共享的。如果说在A库中import了B库,B库import了C库,A库是没有办法直接使用C库的对象的。而B,C若是A的part,那么三者共享所有对象。并且包含所有导入
没有打包的过程
一个程序包含多个协程,就像一个进程包含多个线程。多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制
协程我的理解,协程包含到线程里,一个线程包含多个协程,就是采用promise的异步操作就会生成一个协程。
node采用的是分代式垃圾回收机制,分为新生代和老生代
scavenge算法中将新生代分为两个部分,每一部分叫semispace(半空间),这两个半空间中,只有一个处于使用状态,from空间和to空间,from处于使用状态,to处于闲置状态。变量定义后会存放到from空间,当进行垃圾回收时会检查from空间中存活的对象,这些存活的对象将被复制到to空间,没有用到的则释放,然后将to和from互换,简言之,新生代的垃圾回收,就是将存活的对象在两个semispace之间进行复制。
老生代存放的是一直使用的变量。当新生代垃圾回收时,即从from复制变量到to时,有两种情况会直接放到老生代,1. 如果to的占有率超过25%时,则直接将变量晋升到老生代,2. 如果变量经历过垃圾回收了,则直接晋升到老生代。这样to空间就会少,to和from交换时就会不同了。
老生代的垃圾回收机制,现在应该是增量回收(还是说是需要自己配置的?)
目前是mark-sleep算法和mark-compact算法相结合的方式进行垃圾回收。就是标记整理后,将活着的对象往一端移动,清除掉不用的空间,这样内存就不是碎片化的了,就可以存放大的数据了。这两种算法是怎么结合的呢,由于mark-compact需要移动对象,所以它会影响速度,正常情况下采用的是mark-sleep算法,只有在剩余空间不足以分配从新生代过来的对象时才进行mark-compact算法
鉴于node是单线程的,所以垃圾回收会阻塞代码的进行,因此就有增量回收机制,就是从标记开始,将之前一口气标记完成的操作改为增量标记,拆分成很多小步进,每完成一步进,就让程序执行一会,垃圾回收与应用程序这样交替进行,直到标记阶段完成。那整理和清理的过程呢,还是说标记用的时间最多。
Python中常用的内置模块
os
shutil
sys
random
hashlib
json
https://blog.csdn.net/python36/article/details/124154266
页面需要更新的页面结构可以用 RepaintBoundary组件嵌套,flutter 会将包含的组件独立出一层”画布”,去绘制。源代码的解释 创建隔离重绘的小部件 所以性能可以省很多
如果你的自定义View比较复杂,应该尽可能的避免重绘。使用RepaintBoundary或者RenderObject.isRepaintBoundary为true可能会有对你有所帮助。局部的重绘,将子节点与父节点的重绘分隔开
https://blog.csdn.net/qq_17766199/article/details/103452637
Relayout boundary
它的目的是提高flutter的绘图性能,它的作用是设置测量边界,边界内的Widget做任何改变都不会导致边界外重新计算并绘制。
https://www.jianshu.com/p/47a6503f8e65
relayout boundary和repaint boundary都是Flutter为了提高绘图性能而做的努力。通常开发者可以使用RepaintBoundary组件来提高应用的性能,也可以根据relayout boundary的几个规则来使relayout boundary生效,从而提高性能。
树的更新规则
找到widget对应的element节点,设置element为dirty,触发drawframe, drawframe会调用element的performRebuild()进行树重建
widget.build() == null, deactive element.child,删除子树,流程结束
element.child.widget == NULL, mount 的新子树,流程结束
element.child.widget == widget.build() 无需重建,否则进入流程5
Widget.canUpdate(element.child.widget, newWidget) == true,更新child的slot,element.child.update(newWidget)(如果child还有子节点,则递归上面的流程进行子树更新),流程结束,否则转6
Widget.canUpdate(element.child.widget, newWidget) != true(widget的classtype 或者 key 不相等),deactivew element.child,mount 新子树
子树的深度变化,会引起子树重建,如果子树是一个复杂度很高的树,可以使用GlobalKey做为子树widget的key。GlobalKey具有缓存功能