flutter实践篇-从零开始

439 阅读3分钟
开头: 从零记录flutter开发过程中遇到的问题
0、flutter package get命令总会卡主,配置国内环境。
    详见https://www.jianshu.com/p/147f0e20c312
1、android 状态栏跟启动页问题相关 
   1.1 android 启动 白屏/黑屏 问题解决
       在android 工程目录下,找到res的values目录下的styles.xml文件,theme设置中添加
            <item name="android:windowBackground">@drawable/launch_background</item>,
        该图片即为默认图
    1.2、android 状态栏 高度设置
       1.2.1 沉浸式全透明时,可以手动添加状态高度
            MediaQueryData.fromWindow(window).padding.top
       1.2.2 其次,另外有safeArea控件,自动留出状态栏高度padding
2、资源问题
   桌面启动图标,分别在android、ios对应 图标目录放入对应图标尺寸
   正常图片,可以根目录创建images目录,并在其中创建2x、3x命名的目录,放入对应尺寸的图片。
   并在pubspec.yaml文件的asset节点,配置上对应图片名称。
       例 assets:
                - images/icon_back.png
                - images/icon_avator.png
    flutter 默认尺寸单位为dp, 可按720设计图布局 计算方式 1dp = 2px
3、复用问题
   flutter UI显示是 element树,element根据widget配置创建。更新时,widget有缓存,使用缓存配置;
   无缓存,则重新创建widget;element如果可复用,则根据widget配置复用更新(牵涉到key);不可复用,移除
   旧element,根据widget配置创建新的element加入节点树。

   key 是widget的标识,判定element是否可复用。
   关键函数
        static bool canUpdate(Widget oldWidget, Widget newWidget) {
            return oldWidget.runtimeType == newWidget.runtimeType
                && oldWidget.key == newWidget.key;
          }
4、关于 yield 可参考 https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
5、net
   dart:io 基础网络请求
   dio 进一步封装的网络框架
   => https://github.com/flutterchina/dio
6、Expanded控件
   父控件必须是Flex类型, Flex、Row、Column,否则报错。该控件充满主轴可用空间,类似安卓Match_Parent效果。
   Stack -> Align、positioned,实现类似android RelativeLayout效果。
   当需要实现 距离屏幕底部特定尺寸的布局时,可用到。
7、响应式
   stream、sink、rxdart
8、async、await future 异步
   异步函数使用async标识,当该异步函数需要函数返回值时,使用await关键字。此时返回值,  
   会自动用Future包装。例:如图 8.1
   调用该异步函数时,可使用await去获取值,也可以通过返回值Future对象then操作去获取,如图 8.2
9、json 序列化、反序列化
    使用json_serializable进行序列化
    pubspec.yaml
           dependencies:
             # Your other regular dependencies here
             json_annotation: ^2.0.0
           
           dev_dependencies:
             # Your other dev_dependencies here
             build_runner: ^1.0.0
             json_serializable: ^2.0.0
     ==> https://flutterchina.club/json/
    
    注意事项, 安卓开发时,GsonConvert对int和string类型数据可以统一按string接收。而该反序列化方式会报异常,需要额外处理。
    class JsonUtil {
      static String asString(dynamic param) {
        if (param is String) {
          return param;
        } else if (param == null) {
          return "";
        } else if (param is num) {
          return param.toString();
        } else {
          return "";
        }
      }
    }
    反序列化时,对生成的bean.g.dart中,调用该函数,解析xx字段 JsonUtil.asString('xx')
10、工厂构造函数
11、输入框 TextField
    获取输入框文本 TextEditingController.text
    输入完成切换焦点  
        FocusNode secondTextFieldNode = FocusNode();
        onEditingComplete: () => { FocusScope.of(context).requestFocus(secondTextFieldNode)}
    hint提示样式
        decoration: InputDecoration(hintText: "请输入手机号码或邮箱",
                                    border: InputBorder.none,
                                    hintStyle: TextStyle(
                                        color: Color(0xffc7c7cd),
                                        fontSize: 15)),
12、页面称为route,页面切换方式
13、状态管理 https://juejin.cn/post/6844903684728422413
    redux 可以直接看git上exapmle,初步感觉跟bloc极其相似、
            https://github.com/brianegan/flutter_redux
    provide (scopeModel升级版)
    bloc 
        参考帖子 https://www.jianshu.com/p/024b19dea138
14、单元测试
    test文件夹
15、typeDef
    https://www.jianshu.com/p/010d2dff6845

8.1 图

8.2 图
13 redux中的store类图

简单概括
源头数据 action(和initalState)
中间处理 middeware + reducer
输出 state 且 StreamController.add(state)