<flutter>跨平台开发新手入坑指南 dart dio pubspec.yaml json_annotation 打包 小坑指南

news2025/1/11 10:59:15

1.资源文件和依赖三方包(pubspec.yaml)

pubspec.yaml文件可以说是和安卓的gradle文件差不多,它用来描述版本号、sdk、依赖等的。

在资源导入方面同安卓不一样的是,flutter需要在pubspec.yaml中声名,不然在dart文件中是引用不到的,但是pubspec.yaml中不论是资源声名还是依赖都需要固定格式,例如:

 就类似这样,有几个空格、对不对齐都决定着你是不是能依赖和声明成功。

我们可以对资源声明目录,但是批量指定并不递归,只有在该目录下的文件才可以被包括,如果下面还有子目录的话,需要单独声明子目录下的文件。

2.适配

图片资源适配也是和安卓差不多,分为2.0x,3.0x,4.0x,系统会自动根据屏幕选择最接近的分辨率,这里需要注意的是,比如说目录是在assets/images/下面创建的分辨率包,那images根目录下就是1.0x的分辨率,而且这里也必须要有对应的资源,因为它是资源的标识符。

 字体大小和宽高等的适配也有是对应框架的,我们可以添加依赖:flutter_screenutil: ^0.4.2,然后在入口里对它添加对应的设计尺寸进行初始化:

ScreenUtil.instance = ScreenUtil(width: 375, height: 893)..init(context);

 然后在dart里使用ScreenUtil.setXXX就可以了。

3.网络请求和json解析

经常用到的应该就是dio了,它的请求贴下代码吧:

  static Future<Map<String, dynamic>> requestPost<T>(
      String url, Map<String, String> map) async {
    String path = HttpConfig.baseUrl + url;
    //添加头部信息
    BaseOptions options = BaseOptions();
    options.headers["Accept-Encoding"] = "gzip";
    options.headers["Accept"] = "application/json";
    options.contentType = "application/json; charset=utf-8";
    // options.headers["User-Agent"] = getUserAgent();
    options.connectTimeout = HttpConfig.timeOut;
    options.headers["Authorization"] = "Bearer";

    String currentTimeMillis =
        DateTime.now().microsecondsSinceEpoch.toString().substring(0, 10);

    //公参配置
    map["sign"] = "";
    map["device_code"] = device_code;
    map["timestamp"] = currentTimeMillis;
    map["uid"] = uid;
    Dio dio = Dio(options);
    //添加拦截
    dio.interceptors.add(
      InterceptorsWrapper(
          onRequest: (RequestOptions options) {

          },
          onResponse: (Response response) {
            //拦截处理后台的错误格式数据
            var errData= response.data.toString();
             xxx ...
            return response;
          },
          onError: (DioError dioError) {

          }),
    );
    Response response = await dio.post(path);
    var str = jsonDecode(response.data); //处理一下返回Future数据
    return str;
  }

请求很简单,我想讲的主要点是解析数据,我用到了json_annotation,一开始我是用了网络大家都推荐的FlutterJsonBeanFactory 插件,插件中心下载安装后发现创建File->New>JsonToDartAction里面的JsonToDartAction点击没有任何反应,最后怀疑就是因为as版本或者其他什么环境的问题,那捷径没走成,那就找到了另一个工具插件JsonToDartClass,它的用法流程其实和所谓的jsonFormart差不多,首先新创建一个dart类,然后在类里右键选择Generate,点击JsonToDartClass,会出现下图:

 将正确无误的json格式的json数据填入里面点ok(注意是正确格式的json,否则会出错),我们就会生成这么一个类:

接着我们会发现报错了,那是因为我们还有一步操作,也是容易出问题的地方,这里就和咱们原生安卓不一样了,我们需要在项目根目录下运行命令:

flutter packages pub run build_runner build,如果你运气够好,那会在你这个dart文件的同级文件夹内生成一个.g.dart的文件,此时所有的报错就都会消失了,这时候我们就需要:

var datas = JSDataBean.fromJson(result); 来获取到data就可以各种赋值了。

但是上边说运气好的情况,运气不好,你就会遇到以下问题:

1.因为json格式有误导致的生成出错,改正格式即可

2.有些报错(比如:Failed to build build_runner:build_runner:)发现和build_runner的版本号有关系,需要调整版本号

3.报错Flutter Conflicting outputs were detected and the build is unable to prompt for permiss,这个时候是生成的dart_tool目录下缺少了之前生成的文件导致的报错,可以依次执行下边命令即可:
1、flutter packages pub run build_runner clean
2、flutter packages pub run build_runner build --delete-conflicting-outputs
3、flutter packages pub run build_runner build

当然也有一劳永逸的办法,运行flutter packages pub run build_runner watch可以以后自动生成。

4.打包体验流畅的app

说到flutter都知道debug版本可以热更,HotReload和HotRestart,只需要ctril+s就可以直接预览界面,非常的方便有效率,由于debug和relase编译机制不一样(debug是jit即时编译,relase是aot提前编译),所带来的问题就是debug版本性能阉割太厉害,调试的时候可以感受得到卡的像老年机,那我们打正式包:

1.生成key文件:执行命令:

keytool -genkey -v -keystore E:\_as_project_me\flutter_app\flutter_app_key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key

此时会提示让填入各种信息,依次填写就行,完成后就可以生成key文件了。

2.配置安卓gradle

signingConfigs {
    release {
        keyAlias 'key'
        keyPassword 'xxx'
        storeFile file('E:\\_as_project_me\\flutter_app\\flutter_app_key.jks')//此种写法默认key文件在android-app文件夹下
        storePassword 'xxx'
    }
    debug {
        keyAlias 'key'
        keyPassword 'xxx'
        storeFile file('E:\\_as_project_me\\flutter_app\\flutter_app_key.jks')//此种写法默认key文件在android-app文件夹下
        storePassword 'xxx'
    }
}

3.打包执行命令:flutter build apk,如果报安全问题,则执行:flutter build apk --no-sound-null-safety 即可。

 关于苹果打包,我也尝试装了个黑苹果,安装了xcode和as导入项目,不过还没获得苹果开发者账号,所以没把流程走到最后,有个文章可以大家参考下:

Flutter IOS 真机调试,无需开发者账号! - Kxmrg的开发日记

5.dart的语法等一些细节

1.expand:填充满剩余空间,比如:children中的子控件想要拉伸,例如spaceBetween这种的,需要对children外部的Container嵌套一个Expanded才行,先把外部容器拉伸。

2.SingleChildScrollView嵌套容器时候 如果是listview则设置   physics:NeverScrollableScrollPhysics(),  shrinkWrap: true,    否则就给父组件设置固定高度:constraints: BoxConstraints(maxHeight: 100),

3.NestedScrollView 同安卓 折叠组件SliverAppBar

4.ListView中Axis.horizontal时,需要父view指定高度

5.在GridView中的元素无法设置其宽高,主要通过childAspectRatio来设置其比例,通过比例来显示其大小

6.显示省略号overflow: TextOverflow.ellipsis

7.如果你适应了java的new对象写法,写一个new Container时,他会有黄色警告,去掉new就好了

8.const:当一个变量在编译时就确定而且以后不会再发生改变的时候,我们将使用const来修饰,节省build时间

9.color 和 decoration 是互斥的,如果同时设置它们会报错,因为当指定 color 属性时,在 Container 内会自动创建一个 decoration。

10.bottomNavigationBar中,onTab切换会把页面重置,这时候需要页面继承AutomaticKeepAliveClientMixin ,重写 @override   bool get wantKeepAlive => true; 可解决。

11.late JSDataBean jsData;为稍后初始化,可去掉强制让初始化的限制 ,在使用前被初始化

12  .?(类型后面跟操作符 ? 表示当前变量可为null。)
        !(在使用可为null的变量时对可为null变量的另一种处理方式)

13.Stack相当于RelativeLayout,children里面层叠,要居中给Stack设置alignment

.........

有时间会再更新,不足之处多多指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/118306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PCB专题】Allegro元件库路径设置方法

正常Layout拉线前,需要将原理图导出的网表导入到Allegro里,Allegro就会自动将元件导入。如果库路径没有设置或都软件找不到器件,将会非常的卡顿,并且报Completed with warnings/errors。如下图所示: 在弹出的错误报告View of file:netrev.lst中会提示很多器件找不到封装。…

js知识点

js有预解析阶段&#xff0c;变量声明提升只提升定义&#xff0c;不提升值 console.log(a);//undefined var a10; 基本数据类型 Number、String、Boolean、Undefined和Null 复杂数据类型 Object、Array、Function、RegExp、Date、Map、Set等 使用typeof运算符可以检测值或…

刷爆力扣之验证回文串 II

刷爆力扣之验证回文串 II HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff…

第六章 作业【数据库原理】

第六章 作业【数据库原理】前言推荐第六章 作业第6章第1题&#xff08;简答题&#xff09;第6章第2题&#xff08;简答题&#xff09;第6章第3题&#xff08;设计题&#xff09;第6章第4题&#xff08;设计题&#xff09;最后前言 2022-12-27 16:05:55 以下内容源自数据库原理…

最大连续子序列的和问题(算法)

问题描述 给定一个有n&#xff08;n≥1&#xff09;个整数的序列&#xff0c;要求求出其中最大连续子序列的和。 蛮力法 暴力枚举 /*** 时间复杂度&#xff1a;O(n^3)* param arr 序列[数组]* param n 数组大小* return int */ int maxSubSum1(int arr[], int n) {int thi…

美团餐饮SaaS基于StarRocks构建商家数据中台的探索

作者&#xff1a;何启航&#xff0c;美团餐饮SaaS数据专家&#xff08;文章整理自作者在 StarRocks Summit Asia 2022 的分享&#xff09; 随着社会经济的发展&#xff0c;餐饮连锁商家越来越大&#xff0c;“万店时代”来临。对于美团餐饮 SaaS 来说&#xff0c;传统的 OLTP …

LeetCode 324 周赛

2506. 统计相似字符串对的数目 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成&#xff0c;则认为这两个字符串 相似 。 例如&#xff0c;"abca" 和 "cba" 相似&#xff0c;因为它们都由字符 a、b、c 组成。然而&#xff…

HQChart实战教程54-renko砖形K线图

HQChart实战教程54-renko砖形K线图 Renko砖形图效果图使用HQChart创建Renko初始化创建Renko配置参数说明ClassNameOption动态修改Renko配置参数完成demo代码Renko砖形图 Renko砖形图是仅测量价格变动的图表类型。 “ renko”一词源自日语单词“ renga”,意为“砖”。并非巧合…

day30【代码随想录】分割回文串、复原IP地址、子集

文章目录前言一、分割回文串&#xff08;力扣131&#xff09;二、复原IP地址&#xff08;力扣93&#xff09;三、子集&#xff08;力扣78&#xff09;总结前言 1、分割回文串 2、复原IP地址 3、子集 一、分割回文串&#xff08;力扣131&#xff09; 给你一个字符串 s&#xf…

前端开发:关于鉴权的使用总结

前言 前端开发过程中&#xff0c;关于鉴权&#xff08;权限的控制&#xff09;是非常重要的内容&#xff0c;尤其是前端和后端之间数据传递时候的请求鉴权校验。前端鉴权的本质就是控制前端视图层的显示和前端向后台所发送的请求&#xff0c;但是只有前端鉴权&#xff0c;没有后…

MyGDI+

文章目录[toc]界面设计Form窗口MenuStrip画笔其他选项界面美化整体框架设计DataStructureCPointPolylinePolygonSingletonGraphicFunctionForm事件处理成员变量事件处理总结界面设计 Form窗口 首先添加MenuStrip控件&#xff0c;随后在Form窗口属性界面根据个人爱好修改其图标…

请收下这份数字IC面试超强攻略!(内附大厂面试题目)

2022年马上就要结束了&#xff0c;想必今年有很多同学也已经感受到IC行业的门槛在不断提升&#xff0c;这一点尤其在面试的过程中感受明显。 前两年的时候&#xff0c;面试官有可能问一些比较简单的问题就能通过&#xff0c;今年可就没那么简单了&#xff0c;必须提前做好相关…

SQL的模型类

在Qt的数据库中&#xff0c;除了QSqlQuery访问数据库&#xff0c;还可以使用QSqlQueryModel&#xff0c;QSqlTableModel和QSqlRelationalTableModel&#xff0c;这三个类是从QAbstractTableModel派生下来的&#xff0c;可以很直观的查看数据库的数据 QSqlQueryModel 提供一个…

Educational Codeforces Round 98 (Rated for Div. 2) D. Radio Towers

翻译&#xff1a; 坐标线上有&#x1d45b;2个城镇&#xff0c;编号从0到&#x1d45b;1。&#x1d456;-th镇位于&#x1d456;点。 你在城镇1、2、…、&#x1d45b;以12的概率建造一个无线电塔(这些事件是独立的)。之后&#xff0c;您希望将每个塔上的信号功率设置为从1到…

C/C++开发工具CLion v2022.3全新发布——支持C++ 20

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的&#xff0c;包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C&#xff0c;同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

C++ 当基类为抽象类时如何析构派生类

前言&#xff1a;本教程不涉及基础&#xff0c;稍微了解一下Cvirtual多态的知识就可以了&#xff0c;不了解的话可以先去看一下菜鸟教程&#xff0c;也可以看我往期的文章《virtual》、《虚函数表》 多态分为静态多态和动态多态 静态多态&#xff1a;也成为编译时的多态&#…

使用Word模板导出Word后,表格后面产生空白页

目录 背景 解决 参考 背景 项目中有导出Word功能,其实现逻辑是先整理一个Word文档,里面使用占位符;代码读取Word文档,然后替换占位符。 但出现这样的问题:填充某个表格后,表格后面出现了空白页。 解决 调查发现是段落标记导致的,如何显示段落标记?File -> Op…

生成对抗:DCGAN

DCGAN简介 Generative Adversarial Networks(GANs),GANs有两个模型组成,一个是生成器,用于训练生成假的数据,另一个是判别器,用于预测生成器的输出结果。其中生成器提供训练数据给判别器&#xff0c;提高判别器的准确率。判别器提供生成样本的预测结果&#xff0c;给生成器提供…

【Java系列】小小练习——带你回顾Java基本运算符

返回主篇章         &#x1f447; 【Java】才疏学浅小石Java问道之路 Java小练习1. 练习一1.1 题目1.2 题解(附解析)2. 练习二2.1 题目2.2 题解(附解析)3. 练习三3.1 题目3.2 题解(附解析)小结1. 练习一 1.1 题目 一个三位数&#xff0c;将其拆分为个位、十位、百位后…

mac安装cocoapods完整步骤

一、概念理解 首先不要急着搜索终端命令&#xff0c;你需要明白安装 cocoapods 都需要什么环境&#xff0c;这对于安装途中如果遇到问题该如何解决很重要&#xff0c;很重要&#xff0c;很重要&#xff01; 1、安装pods需要依赖 ruby 环境&#xff0c;而安装 ruby 你需要借助工…