Android开发

来源:https://www.worthpen.top/blog?id=656617516aa58e39d9301941

1 Android

1.1 线程和activity的关系

Activity在默认情况下是运行在一个进程的主线程中。当另一个线程运行调用activity中的成员或者方法时,finish activity不会导致activity的结束,也不会产生错误。

1.2 动画设计

overridePendingTransition(int enterAnim, int exitAnim)有两个参数,分别对应两个xml资源ID,参数1是进入的activity的运动位置和持续时间,参数2是出去的activity的运动位置和持续时间。set的xml文件中的translate元素fromXDelta属性值的参考系是左上角,X轴向右为正。

1.3 常用变量简写规则

activity-aty
fragment-frgm
Button-btn
Textview-tv
Imageview-iv
Editview-ev
Viewpager-vp

1.4 不需要任何权限获得Android设备的唯一ID

https://blog.csdn.net/nugongahou110/article/details/47003257

1.5 防止点击应用桌面图标重新启动App

https://blog.csdn.net/carson2440/article/details/77767919

2 Flutter

2.1 部件

一个部件的布局本质上即是自己的大小和位置。自身不能决定自己的位置,需要父部件才能给出自己的位置。
接下来,给出一些关于部件的名词定义。
(1) 边界指的是约束;
(2) 屏幕边界指的是无父组件边界时,由屏幕大小构成的边界,屏幕边界与边界是不同的情况(佐证:当屏幕边界时,Container会包裹内容,当边界时,Container会扩充至边界),并且当某个部件绘制为屏幕边界时,该部件对子部件提供的边界依然是屏幕边界;
(3) 包裹内容意味着不提供边界,父部件的边界为子部件的边界。
接下来,给出测试某些部件的某些特点的方法。
(1) 测试当存在子部件的情况下是否包裹内容:
判断是否包裹内容需要一个大小稳定的子部件,这里采用Text作为子部件。父部件需要提供屏幕边界,之后对子部件进行居中处理或背景变色以确定测试部件的大小。此时,当包裹内容时,子部件不居中;当不包裹内容时,子部件居中。(该测试方法不完备,需要后续进行修改)
(2) 可以通过SingleChildScrollView()测试无屏幕边界的情况;
(3) 测试当父部件为屏幕边界时,对子部件提供的是边界还是屏幕边界
使用指定大小的Container,当为屏幕边界时,Container为指定大小,当为边界时,Container为不为指定大小。
(4) 如何测试Text仅包裹内容
在具有边界和无边时进行居中的情况下文字会居中,而不带有空格,证明了该部件未扩展。

2.1.1 Text

放置文字,不能改变大小和位置,包裹内容。可以改变颜色和其他装饰(下划线等)。

2.1.2 Center

居中部件,将部件内的子部件置于部件的中心。可以改变自身大小,判断流程如图。虽然本身有大小,但自身不形成边界,对于超过自身大小的部件,会在Center部件外绘制。
在这里插入图片描述

2.1.3 Container

可以提供子部件位置、边界大小和位置大小。当增加alignment属性后,Container的绘制流程转化为Center部件。绘制流程如图。
在这里插入图片描述

2.1.4 Image

Center和Container的判断条件均符合:边界、指定尺寸、子部件、屏边。经过对Image的分析,Image同样符合,其判断条件为:边界、指定尺寸、屏边(Image必然有子部件)。其中,Image较为特殊的地方为当无屏边时,最大的值是图片的最大值,和fit等属性无关。

2.1.5 ScrollView

可滑动部件对可滑动方向不提供边界,属于无屏边状态。无子部件则消失。当子部件同样为可滑动部件时,则报错。绘制逻辑与container相同。

2.1.6 ListView

可滑动部件。首先扩展为边界,无边界则扩展为屏幕边界。当父部件提供屏幕边界时,对子部件在非滑动方向提供边界。

2.1.7 GridView

不能实现瀑布流,其他和ListView类似。

2.1.8 Row和Column

Row自身的绘制会优先扩充至边界,无边界则主轴扩充至屏幕边界,横轴包裹内容。与ListView不同,Row对内不提供边界和屏幕边界,但是会限制部件的范围(此处不提供边界和屏幕边界的意思是会导致子部件优先包裹内容)。而且Row不是可滑动部件。Row的对齐不会转化为Center组件。

2.1.9 Expanded

Expanded用在Row和Column中,使其子部件在主轴方向扩充至与其他Expanded成比例,如果无其他Expanded则自己尽可能大。Expanded在其他控件中不会将屏幕边界转化为边界以使子部件尽可能大,其目前只能用于Row和Column。

2.1.10 Stack

尽可能扩展,并提供屏幕边界

2.1.11 Positioned

相当于Center,首先给出自身边界范围,随后针对自身边界,划定子部件的位置。且左右或者边界只能同时有两个,这避免了Positioned的歧义。

2.1.12 StatefulWidget

StatelessWidget依赖于父部件来创建state、绘制和输入数据等,而StatefulWidget由自身管理自己的state,因此,StatelessWidget中可以包含StatefulWidget。
创建该部件的快捷键:Android Studio自带的有StatefulWidget和Stateless模板方法,分别是stful、stless。

2.1.13 ElevatedButton

按钮部件,存在边界会扩展至边界,否则包裹内容。

2.1.14 自定义具有长按监听的TabBar部件

在Flutter官方TabBar部件中,添加如下内容:
(1)可选参数:this.onLongTap,
(2)成员变量:final ValueChanged? onLongTap;
在_TabBarState类中,添加函数
void _handleLongTap(int index) {
assert(index >= 0 && index < widget.tabs.length);
if (widget.onLongTap != null) {
widget.onLongTap!(index);
}
}
在_TabBarState的build方法的InkWell部件的定义中,增加onLongPress参数为onLongPress:(){_handleLongTap(index);},

2.2 配置问题

2.2.1 Flutter配置在AndroidStudio最新教程

https://blog.csdn.net/qq_37199105/article/details/81007683

2.2.2 AndroidStudio安装Flutter,找不到设备

https://blog.csdn.net/lindepeng318611/article/details/107199008

2.2.3 运行报错License for package Android SDK

https://blog.csdn.net/qq_35605213/article/details/93893975

2.2.4 编译Android项目时,卡在Running Gradle task ‘assembleDebug’

翻墙大法好

2.2.5 Android Studio新建Flutter项目时间过长

https://blog.csdn.net/xudailong_blog/article/details/92233727

2.2.6 Waiting for another flutter command to release the startup lock

https://blog.csdn.net/qq_42895379/article/details/84878141

2.2.7 在设备上安装release版APK

https://www.jianshu.com/p/4407efb0d912
该操作不会导致APP数据库数据丢失。

2.2.8 flutter doctor Android license status unknown.时出现Exception in thread “main“ java.lang.NoClassDefFoun

https://blog.csdn.net/adley_app/article/details/117927658

2.2.9 启动页开发

https://www.jianshu.com/p/3d06d55343a9?tdsourcetag=s_pctim_aiomsg

2.2.10 序列化过程中的注意事项

(1)添加依赖
json_serializable: ^3.0.1
build_runner: ^1.7.2
不添加build_runner无法进行自动生成
(2)运行flutter packages pub run build_runner build 报错
新建项目,重新执行,序列化后,将序列化后的文件复制到原项目
(3)给序列化对象添加标注和导入
// 需要在序列化前写如下带入代码,不然会出错
part ‘feedback.g.dart’;
//在序列化对象前添加
@JsonSerializable()
(4)序列化对象中要添加如下方法
fromJson和toJson

2.3 插件

2.3.1 国际化插件

转载自:https://blog.csdn.net/qq_39424143/article/details/105496999

安装插件

Android Studio -> File -> Setting -> Plugins -> 搜索Flutter Intl
在这里插入图片描述

配置项目

首先在项目pubspec.yaml中添加如下语句并执行 package get

dev_dependencies:
...
  flutter_localizations:
    sdk: flutter

在菜单栏的Tool下找到Flutter Intl 并选择Initalize for the project, 配置结束后效果如下:

  1. 会在 pubspec.yaml中增加以下字段
flutter_intl:  
    enabled: true
  1. 会在lib目录下增加 generated 和 l10n两个包
    在这里插入图片描述

generated包下的intl包默认存在一个messages_all.dart和messages_en.dart文件,messages开头的文件会在添加语言后自动生成

l10n包下存在一个intl_en.arb文件

添加语言

Tool下找到Flutter Intl 并选择Add Locale, 并输入语言类型(eg: zh),配置结束后会生成如下文件

  1. lib目录下l10n包下会生成一个 intl_zh.arb
  2. generated包下的intl包中生成messages_zh.dart文件
    初始化Flutter国际化
    在主页面build中加入
return MaterialApp(
  ...
    localizationsDelegates: const [
      S.delegate,
      GlobalMaterialLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate
    ],
    // 设置中文为首选项
    supportedLocales: [const Locale('zh', ''), ...S.delegate.supportedLocales],
  ...
);
配置多语言

分别在 intl_en.arb 和 intl_zh.arb下添加字符串
在需要配置国际化的地方调用S.of(context).字符串即可
示例效果
完整项目:https://blog.csdn.net/qq_39424143/article/details/105496999
在这里插入图片描述

2.3.2 更新库XUpdate

https://pub.dev/packages/flutter_xupdate

2.3.3 可用flutter的后端云比较

Bmob:性价比高,更新慢,不支持空安全
LeanCloud:更新较快,具有空安全,但是价格略贵
CloudBase:腾讯的,更新在bmob之后,无空安全,价格最贵

2.3.4 bmob后端云

使用0.0.18版本时,需要更改依赖版本crypto: ^3.0.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoilingHotPot

听说打赏我的人,都发顶会顶刊了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值