Flutter基础:Dart编程语言——基本概念及变量类型

因为Futter应用程序使用的编程语言是Dart,所以还是要先了解Dart这门语言的一些基础知识的。
目前为止网络上已经很多Dart的资料,我就不从0开始详细解释语法了,而是挑一些比较关键的点,做一下简单的梳理。

基本概念

Dart中所有变量皆为对象,不像OC在使用基本类型时候不带指针和java的int与它包装类Integer一样。
在Dart中,所有对象初始值都为null,他们继承自Object。

使用固定的num可以明确代码中的数据表示的是数字类型,但这不是强制性的,如果你不确定你将要使用什么类型的数据,可以使用特殊的dynamic来表示当前的类型。

Dart支持在类中定义方法,类中的方法可以是静态方法,也可以是实例方法。更厉害的是你还能在方法中来定义方法(是的你没看错)。

同样,Dart支持静态变量和实例变量。

Dart没有类java的权限修饰符(public、protected、private),但有一个_的标识符,如果以这个标识符开头,代表这个标识符在当前类中是私有的,这点有点类似OC的-+

阅读更多
第一个Flutter程序-Android Studio篇

本文将通过Android Studio创建第一个Flutter应用。

创建Project

在Android Studio的启动页面,选择“Start a new Flutter project”,如下图1所示:

阅读更多
Flutter开发环境搭建

配置国内镜像

打开mac的终端,按顺序执行以下命令:

1
2
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
阅读更多
Recyclerview里的倒计时控件与其ViewHolder机制的兼容

众所周知RecyclerView中是使用ViewHolder来优化内存的,而如果在RecyclerView中使用倒计时控件的话,在来回滑动的时候你就会发现倒计时控件被重置了时间~

这~还倒计时个锤子哦。

下面提供一种利用客户端时间差的思路解决这个问题。

阅读更多
Android系统源码分析:从一次WebView的loadUrl报NullPointerException说起

异常及初步分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
java.lang.NullPointerException
at android.webkit.WebViewClassic.loadUrlImpl(WebViewClassic.java:2740)
at android.webkit.WebViewClassic.loadUrlImpl(WebViewClassic.java:2756)
at android.webkit.WebViewClassic.loadUrl(WebViewClassic.java:2749)
at android.webkit.WebView.loadUrl(WebView.java:843)
at com.fbmodule.moduleother.lyric.LyricFragment$5$1.run(TbsSdkJava:243)
at android.os.Handler.handleCallback(Handler.java:800)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5392)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)

这个异常出现频率非常低,异常涉及到LyricFragment,而在这个fragment中的这一行执行了loadUrl的操作,这个操作是在onPageFinished()回调中进行的,目的是加载完成一个网页后加载一段内置的JS方法。

先去搜了一波Android8.0源码,意料之中找不到WebViewClassic.java这个文件了,想到应该是新版本使用了Chrome内核的问题,于是先去查询了这个异常的对应系统版本。
一查果然是Android4.2,嗯。。。

先找到WebViewClassic.java中的loadUrlImpl方法,可以看到这个方法如下:

1
2
3
4
5
6
7
//WebViewClassic.java
private void loadUrlImpl(String url) {
if (url == null) {
return;
}
loadUrlImpl(url, null);
}
阅读更多
Android Developers官方文档翻译:Room(四)

数据库升级

(原文直译应该是数据库迁移,但按我们正常术语一般表达为数据库升级、数据迁移,所以这里翻译为“升级”)
在App的功能有改动的时候,如果涉及到数据库中的实体类,你同时还要修改这些实体类的代码。当一个用户将你的App更新到最新的时候,你一定不希望他们丢失所有的数据,特别是那些你无法从远程服务器中恢复的数据。

Room提供Migration类,通过Migration类可以在这种情况中保留用户的数据。每一个Migration类都会标明一个startVersion和endVersion。在运行的时候,Room将会依次执行每一个Migration类的migrate()方法,从而保证数据库以一个正确的顺序升级到最新版本。

阅读更多
Android Developers官方文档翻译:Room(三)

使用Room的DAOs获取数据

要获取使用Room持久化库中保存的app的数据,你需要使用data access objects,或者称为DAOs。这组Dao对象是Room的主要组件,因为每个DAO都包含了对app数据库的抽象访问的方法。

通过DAO类来访问数据库而不是通过直接查询或者查询builder,你可以解耦数据库架构中的不同组件。此外,DAO允许你在测试app时轻松模拟数据库的访问。

阅读更多
Android Developers官方文档翻译:Room(二)

使用Room实体类来定义数据

当使用Room持久化类库时,你可以通过实体类(entities)来定义字段和他们之间的关系。关联的Database对象将会为每个实体创建一张数据表。

提醒:开始使用ROOM前,请先添加Adding Components to your Project相关依赖到你app module目录的build.gradle文件中。

默认情况下,Room会为实体类中的每一个属性创建一个数据表的字段。如果一个实体类中包含你不想持久化保存在数据表中的属性,你可以使用@Ignore注解来表示该属性。

阅读更多
Android Developers官方文档翻译:Room(一)

使用ROOM在本地数据库存储数据

ROOM提供了一个可以流畅接入SQLite完整能力的抽象层。

应用程序在面对大量结构化数据的时候,对这些数据进行持久化保存在本地是非常有用的。最普遍的应用场景是将相关联的数据缓存起来。这样做的好处是当设备无法连接网络的时候,用户依旧可以浏览已经缓存过的内容,然后在下一次设备重新连接网络的时候,用户改动过的内容将会同步到服务器中。

阅读更多
iOS官方开发文档翻译_3:NSInteger, NSUInteger, NSDecimal

Numbers包括NSInteger,NSUInteger,NSDecimal,NSDecimalNumber,NSNumber,NSNumberFormatter的官方文档,这里对NSInteger,NSUInteger,NSDecimal进行翻译,下一篇将翻译NSDecimalNumber。
为保证阅读体验,这篇开始不再付英文原文翻译,并且会附上进一步个人理解说明,后面会附上原文链接,可自行参考。
另外,对于Discussion这个词的翻译,我想了很久,也参考了很多资料,决定把它翻译为“细节参考”。

阅读更多