flutter 笔记

Jul 9, 2022


Linux Desktop

如何在flutter中免密码的启动需要root权限的service

keyboard issues in desktop


flutter setup in linux


sudo apt install curl file git unzip xz-utils zip libglu1-mesa clang cmake \ ninja-build pkg-config libgtk-3-dev


Dart


List


setRange

  List<card?> _cards = [null, null, null, null, null] ..setRange(0, cards.length, cards);
  
  final l1 = <int>[1, 2, 3, 4, 5];
  final l2 = <int>[8, 9, 7, 6];
  const int skipCount = 2;
  
  
  l1.setRange(1, 3, l2, skipCount);
  
  print(l1); // [1, 7, 6, 4, 5]
  


Basic


cmd

flutter create -t plugin –platform=linux,macos,windows xxxx


layout


flutter中组件树向下传递约束,向上传递size。其中约束分为loose(松约束),tight(紧约束)两种,loose约束时,子组件可以根据自身size设定,调整大小。

  Container(
    
    child: xx
  )
  
  
  Container(
    constrains: BoxConstrains(
      minWidth: 20,
      minheight: 40,
    )
  
    child: xx
  )
    

比如Container组件默认传递的是loose约束,而添加constrains属性后,可以将container变成传递tight约束。

  • flex组件(e.g. Row, Column)在布局children时,区分组件是否有弹性,比如ListView是没有弹性的,那么在Row中添加ListView组件时必须使用Expanded或者flex组件进行warp。 布局时,flutter先计算没有弹性组件占据的size,然后将剩余的空间分配给所有弹性组件。
  • stack组件在布局children时,区分组件是否是有位置的,比如positoned组件就是有位置的。布局时,flutter先计算没有位置组件的最大size, 然后设为自己的size,但是如果都是具有position的组件,那么flutter就尽可能大的分配自己的size。
  • stack中的stackFit属性[loose, expand, passthrough], 其中expand属性表示子组件尽可能的填充父组件的约束,passthrough表示传递父级约束, 而默认loose属性表示子组件可以根据自身size设定大小。

  • 使用 FractionallySizedBox 根据和parent的比例去设定大小
  Container(
    width: 400,
    height: 400,
    
    child:
      FracitonallySizedBox(
        widthFactor: 0.5,  => 400*0.5 = 200
        heightFactor: 0.5, => 400*0.5 = 200
        
      )
  )


Gloabal key


  • get element properties by _key.currentContext
  final renderBox = _globalKey.currentContext.findRenderObject() as RenderBox;
  print(renderBox.size());
  print(renderBox.localToGlobal(Offset.zero));
  


provider vs ChangeNotifier


provider是为了实现child widget可以直接修改parent中定义的共享数据,并且即使修改了,child widget自身也不会被rebuild,除非这个共享的数据是继承ChangeNotifier的。

所以,provide主要是为了实现自下而上的修改数据,而ChangeNotifier是为了自上而下的传递已经变化了的数据。

windows平台踩坑记录


编译官方推荐项目flutter-folio


  • 由于flutter doctor提示需要vs 2019以上版本,下载了2022安装在了D盘,不在默认的C盘,需要设置环境变量:

    GYP_MSVS_OVERRIDE_PATH=D:\Program Files\Microsoft Visual Studio\2022\Community GYP_MSVS_VERSION=2022

  • 删除C:\Users\13581\AppData\Local\Pub文件夹后导致很大dart依赖文件找不到,从回收站恢复。
  • 出现'Size' is imported from both 'dart:ffi' and 'dart:ui'错误,执行dart fix --applyflutter pub upgrade 后解决。