kotlin 的干货搜集 ,不能错过

1.官方资料
首发的肯定是kotlin的官方github地址了:https://github.com/JetBrains/kotlin

首发的肯定是kotlin的官方github地址了:

https://github.com/JetBrains/kotlin

晚上看了下trending,稳稳的站在第一。

平时大家没事,可以看看github trending,会有很多的新新优质资源。https://github.com/trending/java

Readme中包含官方的tutorials、推荐的图书《Kotlin in Action》、《Kotlin for Android Developers》以及其他资源。

英文不太好的不要担心,有官方中文翻译站点:

https://www.kotlincn.net/docs/reference/
https://www.gitbook.com/book/h ... tails

(2)《Kotlin for android developers》中文版翻译

https://github.com/wangjiegulu ... ME.md

支持在线阅读和下载pdf~

(3)张涛的开源实验室

之前在推送中推荐过张涛的博客,博客质量都很高,在很早的时候就开始编写Kotlin相关博客,此外还有很多比较新的知识~

https://kymjs.com/column/kotlin.html

(4)大精-wing的地方酒馆

让你的代码量减少3倍!使用kotlin开发Android系列~
http://androidwing.net/index.php/89

还有个Kotlin项目:
https://github.com/githubwing/GankClient-Kotlin

(5)Kotlin 视频教程
竟然还有视频教程~~

Kotlin从入门到『放弃』系列 视频教程
随着Kotlin越来越成熟稳定,我已经开始在生产环境中使用它。考虑到目前国内资料较少,我录制了一套视频教程,希望以此抛砖引玉,让 Kotlin 在国内火起来。
https://github.com/enbandari/Kotlin-Tutorials

可以百度云下载或者腾讯视频在线观看。

腾讯视频:http://v.qq.com/boke/gplay/903 ... .html
百度云:
http://pan.baidu.com/s/1nvGYAfB

(6)开源项目
一个用Kotlin写的简单漫画APP
https://github.com/wuapnjie/PoiShuhui-Kotlin

这个是我从俊林的文章中偷来的,如果有推荐可以留言~

(7)其他文章

为什么我要改用Kotlin
http://droidyue.com/blog/2017/ ... tlin/
by:技术小黑屋

Android开发必备知识:为什么说Kotlin值得一试
https://mp.weixin.qq.com/s%3F_ ... 151b6
by:腾讯Bugly公众号

使用Kotlin进行Android开发
http://ragnraok.github.io/usin ... .html
by:Ragnarok Zhou

最后要非常感谢,今天给我投稿的朋友(汇总资料,就直接放出了链接啦)~

使用Kotlin在Android Studio上开发App
http://blog.csdn.net/qq_258671 ... 75330
by:Blincheng

好文有很多,感谢所有人的分享~

Kotlin社区交流群:302755325
 
继续阅读 »
1.官方资料
首发的肯定是kotlin的官方github地址了:https://github.com/JetBrains/kotlin

首发的肯定是kotlin的官方github地址了:

https://github.com/JetBrains/kotlin

晚上看了下trending,稳稳的站在第一。

平时大家没事,可以看看github trending,会有很多的新新优质资源。https://github.com/trending/java

Readme中包含官方的tutorials、推荐的图书《Kotlin in Action》、《Kotlin for Android Developers》以及其他资源。

英文不太好的不要担心,有官方中文翻译站点:

https://www.kotlincn.net/docs/reference/
https://www.gitbook.com/book/h ... tails

(2)《Kotlin for android developers》中文版翻译

https://github.com/wangjiegulu ... ME.md

支持在线阅读和下载pdf~

(3)张涛的开源实验室

之前在推送中推荐过张涛的博客,博客质量都很高,在很早的时候就开始编写Kotlin相关博客,此外还有很多比较新的知识~

https://kymjs.com/column/kotlin.html

(4)大精-wing的地方酒馆

让你的代码量减少3倍!使用kotlin开发Android系列~
http://androidwing.net/index.php/89

还有个Kotlin项目:
https://github.com/githubwing/GankClient-Kotlin

(5)Kotlin 视频教程
竟然还有视频教程~~

Kotlin从入门到『放弃』系列 视频教程
随着Kotlin越来越成熟稳定,我已经开始在生产环境中使用它。考虑到目前国内资料较少,我录制了一套视频教程,希望以此抛砖引玉,让 Kotlin 在国内火起来。
https://github.com/enbandari/Kotlin-Tutorials

可以百度云下载或者腾讯视频在线观看。

腾讯视频:http://v.qq.com/boke/gplay/903 ... .html
百度云:
http://pan.baidu.com/s/1nvGYAfB

(6)开源项目
一个用Kotlin写的简单漫画APP
https://github.com/wuapnjie/PoiShuhui-Kotlin

这个是我从俊林的文章中偷来的,如果有推荐可以留言~

(7)其他文章

为什么我要改用Kotlin
http://droidyue.com/blog/2017/ ... tlin/
by:技术小黑屋

Android开发必备知识:为什么说Kotlin值得一试
https://mp.weixin.qq.com/s%3F_ ... 151b6
by:腾讯Bugly公众号

使用Kotlin进行Android开发
http://ragnraok.github.io/usin ... .html
by:Ragnarok Zhou

最后要非常感谢,今天给我投稿的朋友(汇总资料,就直接放出了链接啦)~

使用Kotlin在Android Studio上开发App
http://blog.csdn.net/qq_258671 ... 75330
by:Blincheng

好文有很多,感谢所有人的分享~

Kotlin社区交流群:302755325
  收起阅读 »

Kotlin从入门到『放弃』系列 视频教程

目前国内唯一一套 Kotlin 入门的视频教程,大家可以关注下,比较有趣。
 
目前国内唯一一套 Kotlin 入门的视频教程,大家可以关注下,比较有趣。
 

自己用的一些kotlin的资源,希望对大家有点帮助

1. 如何评价 Kotlin 语言? 来自知乎,可以看看广大道友是如何评价这个新生代的,不过好不好用还是要看自己
2. Kotlin 官网 英文版,里面的东西很全,但是不是很详细,用来入门是没什么问题了
3. Kotlin 官网 - 中文版 这个和上面一样,只不过是中文的,有需要的可以看一看
4. Kotlin 中文翻译项目  这个在本人爬坑的时候也参考了一部分,只不过好像项目停止更新了
 
姑且先这么多吧,以后友好的资源再拿来分享(PS : 难道只有我一个人在吐槽不能用MD吗?)
继续阅读 »
1. 如何评价 Kotlin 语言? 来自知乎,可以看看广大道友是如何评价这个新生代的,不过好不好用还是要看自己
2. Kotlin 官网 英文版,里面的东西很全,但是不是很详细,用来入门是没什么问题了
3. Kotlin 官网 - 中文版 这个和上面一样,只不过是中文的,有需要的可以看一看
4. Kotlin 中文翻译项目  这个在本人爬坑的时候也参考了一部分,只不过好像项目停止更新了
 
姑且先这么多吧,以后友好的资源再拿来分享(PS : 难道只有我一个人在吐槽不能用MD吗?) 收起阅读 »

关于Kotlin中文文档

目前Kotlin的中文文档比较少,我在Github上找一份更新勤的项目:https://github.com/huanglizhuo ... e.git
web网站地址:http://kotlindoc.com
目前Kotlin的中文文档比较少,我在Github上找一份更新勤的项目:https://github.com/huanglizhuo ... e.git
web网站地址:http://kotlindoc.com

KBinding - 使用Kotlin实现的Android下的MVVM框架

项目地址:https://github.com/BennyWang/KBinding
 
KBinding
Android View Model binding framework write in kotlin, base on anko, simple but powerful.ContentsBindingMode
  • OneWay: Binding from model to view
  • TwoWay: Binding from model to view and view to model
  • OneWayToSource: Binding from view to model
  • OneTime: Binding from model to view, and auto release after first emit

 Simple Binding
verticalLayout {
editText {
bind { text("name", mode = TwoWay) }
}
button {
bind { click("hello") }
}
}
class SimpleViewModel() : ViewModel() {
var name: String by bindProperty("name") { "Jason" }
val hello: Command by bindCommand("hello") { params, canExecute ->
toast("Hello, ${name}!")
}
}
Multiple Binding
//login button enabled only when name and password not empty
class ArrayToBooleanConverter : MultipleConverter<Boolean> {
override fun convert(params: Array<Any>): Boolean {
params.forEach {
if(it.toString().isEmpty()) return false
}
return true
}
}
verticalLayout {
editText {
bind { text("name", mode = TwoWay) }
}
editText {
bind { text("password", mode = TwoWay) }
}
button {
bind { enabled("name", "password", mode = OneWay, converter = ArrayToBooleanConverter()
bind { click("login") }
}
}
class LoginViewModel() : ViewModel() {
var name: String by bindProperty("name") { "xxx@xxxx.com" }
var password: String by bindProperty("password") { "xxxxxx" }
val login: Command by bindCommand("login") { params, canExecute ->
//login processing
}
}
View Model property depends on other properties
//name and price property will be updated when new stock is set
class StockViewModel() : ViewModel() {
var stock: Stock? by bindProperty("stock")
val name: String? by bindProperty("name", "stock") { stock!!.name }
val price: Float by bindProperty("price", "stock") { stock!!.price }
}
Wait/Until
//wait/until just like OneTime binding, but it need apply action, for example below, it wait for market from model, then decide how to display
relativeLayout {
wait { until("market", converter = viewOfMarket) { inflate(it, this@verticalLayout) }
}
Extend Binding Property(Depend on RxBinding heavily)Event
    fun View.click(path: String) : PropertyBinding = commandBinding(path, clicks(), enabled())
Property
fun View.enabled(vararg paths: String, mode: OneWay = BindingMode.OneWay, converter: OneWayConverter<Boolean> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(enabled(), false, converter, *paths)    


//this implements four binding mode for TextView, if just need OneWay mode, remove last three lines, some for other mode
fun TextView.text(vararg paths: String, mode: OneWay = BindingMode.OneWay, converter: OneWayConverter<out CharSequence> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(text(), false, converter, *paths)
fun TextView.text(vararg paths: String, mode: OneTime, converter: OneWayConverter<out CharSequence> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(text(), true, converter, *paths)
fun TextView.text(path: String, mode: OneWayToSource, converter: OneWayConverter<*> = EmptyOneWayConverter<String>()) : PropertyBinding = oneWayPropertyBinding(path, textChanges2(), convert)
fun TextView.text(path: String, mode: TwoWay, converter: TwoWayConverter<String, *> = EmptyTwoWayConverter<String, String>()) : PropertyBinding = twoWayPropertyBinding(path, textChanges2(), text(), converter)

Using with Gradle
dependencies {
compile 'com.benny.kbinding:library:0.1.0'
}
Contribute
Now is just the beginning of KBinding, so everyone interested in this library, just fork it and pull requests to me. Let's make it a little better.
 
Discussion
QQ Group: 516157585
 
继续阅读 »
项目地址:https://github.com/BennyWang/KBinding
 
KBinding
Android View Model binding framework write in kotlin, base on anko, simple but powerful.ContentsBindingMode
  • OneWay: Binding from model to view
  • TwoWay: Binding from model to view and view to model
  • OneWayToSource: Binding from view to model
  • OneTime: Binding from model to view, and auto release after first emit

 Simple Binding
verticalLayout {
editText {
bind { text("name", mode = TwoWay) }
}
button {
bind { click("hello") }
}
}
class SimpleViewModel() : ViewModel() {
var name: String by bindProperty("name") { "Jason" }
val hello: Command by bindCommand("hello") { params, canExecute ->
toast("Hello, ${name}!")
}
}
Multiple Binding
//login button enabled only when name and password not empty
class ArrayToBooleanConverter : MultipleConverter<Boolean> {
override fun convert(params: Array<Any>): Boolean {
params.forEach {
if(it.toString().isEmpty()) return false
}
return true
}
}
verticalLayout {
editText {
bind { text("name", mode = TwoWay) }
}
editText {
bind { text("password", mode = TwoWay) }
}
button {
bind { enabled("name", "password", mode = OneWay, converter = ArrayToBooleanConverter()
bind { click("login") }
}
}
class LoginViewModel() : ViewModel() {
var name: String by bindProperty("name") { "xxx@xxxx.com" }
var password: String by bindProperty("password") { "xxxxxx" }
val login: Command by bindCommand("login") { params, canExecute ->
//login processing
}
}
View Model property depends on other properties
//name and price property will be updated when new stock is set
class StockViewModel() : ViewModel() {
var stock: Stock? by bindProperty("stock")
val name: String? by bindProperty("name", "stock") { stock!!.name }
val price: Float by bindProperty("price", "stock") { stock!!.price }
}
Wait/Until
//wait/until just like OneTime binding, but it need apply action, for example below, it wait for market from model, then decide how to display
relativeLayout {
wait { until("market", converter = viewOfMarket) { inflate(it, this@verticalLayout) }
}
Extend Binding Property(Depend on RxBinding heavily)Event
    fun View.click(path: String) : PropertyBinding = commandBinding(path, clicks(), enabled())
Property
fun View.enabled(vararg paths: String, mode: OneWay = BindingMode.OneWay, converter: OneWayConverter<Boolean> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(enabled(), false, converter, *paths)    


//this implements four binding mode for TextView, if just need OneWay mode, remove last three lines, some for other mode
fun TextView.text(vararg paths: String, mode: OneWay = BindingMode.OneWay, converter: OneWayConverter<out CharSequence> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(text(), false, converter, *paths)
fun TextView.text(vararg paths: String, mode: OneTime, converter: OneWayConverter<out CharSequence> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(text(), true, converter, *paths)
fun TextView.text(path: String, mode: OneWayToSource, converter: OneWayConverter<*> = EmptyOneWayConverter<String>()) : PropertyBinding = oneWayPropertyBinding(path, textChanges2(), convert)
fun TextView.text(path: String, mode: TwoWay, converter: TwoWayConverter<String, *> = EmptyTwoWayConverter<String, String>()) : PropertyBinding = twoWayPropertyBinding(path, textChanges2(), text(), converter)

Using with Gradle
dependencies {
compile 'com.benny.kbinding:library:0.1.0'
}
Contribute
Now is just the beginning of KBinding, so everyone interested in this library, just fork it and pull requests to me. Let's make it a little better.
 
Discussion
QQ Group: 516157585
  收起阅读 »

Kotlin 1.0 Beta 3 已经发布

我们很高兴又呈现了Kotlin 1.0 的Beta版本。我们正在努力完成标准库和摆脱语言中过时的旧结构、以及修复Bug、性能提升、面向未来的检查。
全部的修改列表在此
查看已关闭的提问在此
 
一、库变更
我们努力让标准库在1.0之前进入最佳状态,这会涉及一些实验部分,所以出现了功能的增删,我们计划在1.0build(或者rc)版本中做最后的清理:移除所有的过时和传统部分。
这里我们只从所有修改中给出一个亮点:`contains()`和其他相似的扩展,现在集合接受元素的超类。
// ns: String?
// cs: CharSequence
// i: Int
strs.contains(ns) // accepted now
strs.contains(cs) // accepted now
strs.contains(i) // ERROR (in fact, a deprecation warning, but will be an error soon)
我们发现之前建议的`containsRow`方式低效。而选择采用`contains()`更宽容一些,同时又保持了最初的安全意图。注意集合的接口本身是完整的,而这一切是通过扩展函数完成。使用`Code Cleanup`迁移你的代码。
 
二、语言修改
一些语言修改的亮点,全部列表在此
很多之前是过时的现在已经变成错误,使用`Code Cleanup`来迁移。
 
1. When 表达式
这类代码已经证明是有问题的,所以我们决定让他过时。
when {
foo.isValid(), foo.isReady() -> process(foo)
...
}
很多人以为条件`foo.isValid(), foo.isReady()`代表foo是volid和read同时满足的,但是实际是这个逗号是表示`or`,解决方法十分简单:使用 `||`代替:
when{
foo.isValid() || foo.isReady() -> process(foo)
}
`Code Cleanup`将会迁移你的代码。
 
2. 注解
一个Bug被解决,他是防止我们以注解参数使用数组时为默认值:
annotation class Entry(val value: String)

annotation class Example(
val entries: Array<Entry> = arrayOf(Entry("a"), Entry("b")) // OK now
)
3.Enum.values()
最近,我们修改了传统的Java的`Enum.values()`成为一个属性:`Enum.values`,但是现在我们回滚这个修改。因为这里有一个不愉快的细节用例:在枚举中可能会有一个叫values的常量,同时这里没有办法做到二取一。我们考虑不同的意见后,决定在这次清理中将`values`更改回一个方法。
所以,`values`属性是过时的,`values()`方法是不过时的。
 
4.可见性与作用域规则
你们清理并修复了可见性和作用域规则,所以: 
  • pretected`成员在伴生对象是允许。
  • 从子类中调用伴生对象的非`@JvmStatic protected`成员会标记成错误(不支持)
  • 开放属性的`private`级别 setter 已经弃用。
  • 本地`sealed`类弃用(从来不是可用)
  • 覆盖setter不用削弱可见性
  • 内部类不再允许内嵌枚举中
  • 在lambda、对象常量、本地方法中使用没有初始化的变量是禁止的


三、 Android扩展
我们已经合并了`Kotlin plugin for IntelliJ IDEA`和`Kotlin Extensions For Android`插件。
同样,我们也增加了对Android的`product flavors`的支持,现在不同渠道的属性可以在不同的包中。
productFlavors {
free {
versionName "1.0-free"
}
pro {
versionName "1.0-pro"
}
}
例如,如果我们在build.gradle文件中有两个渠道。
我们现在不仅在`main`代码堆中的布局,同时在渠道布局中也能使用合并的属性。
// Import synthetic properties for the `activity_free.xml` layout in the `free` flavor
import kotlinx.android.synthetic.free.activity_free.versionMarker

class FreeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
setContentView(R.layout.activity_free)
...
versionMarker.text = "Free version"
}
}
注意,main代码集合堆中的布局现在都在`kotlinx.android.synthetic.main`包中,旧的命名约定已经过时。
 
四、IDE中有什么新的
1. Android的扩展插件已经合并到Kotlin插件中,不再需要单独安装。
2. 当新建一个Gradle项目时,我们已经添加一个Kotlin选项:
 
3. 调试:堆栈跟踪导航现在支持内联函数中的栈帧,同样步入内联函数时也有一些提高。
4. 增加了三种属性的快速修复

 5. 引入变量(Ctrl + Alt + V / Cmd + Alt + V)现在支持多声明表达式。

6. 同样他允许选择lambda表达式和匿名函数的容器

7. Beta3给String模板​片段带来引入变量、参数、属性、函数

8. 最后,一个试验性的特征已经添加——在IDE中添加对Kotlin脚本文件最基本的支持。
 
原文地址: http://blog.jetbrains.com/kotl ... -out/
继续阅读 »
我们很高兴又呈现了Kotlin 1.0 的Beta版本。我们正在努力完成标准库和摆脱语言中过时的旧结构、以及修复Bug、性能提升、面向未来的检查。
全部的修改列表在此
查看已关闭的提问在此
 
一、库变更
我们努力让标准库在1.0之前进入最佳状态,这会涉及一些实验部分,所以出现了功能的增删,我们计划在1.0build(或者rc)版本中做最后的清理:移除所有的过时和传统部分。
这里我们只从所有修改中给出一个亮点:`contains()`和其他相似的扩展,现在集合接受元素的超类。
// ns: String?
// cs: CharSequence
// i: Int
strs.contains(ns) // accepted now
strs.contains(cs) // accepted now
strs.contains(i) // ERROR (in fact, a deprecation warning, but will be an error soon)
我们发现之前建议的`containsRow`方式低效。而选择采用`contains()`更宽容一些,同时又保持了最初的安全意图。注意集合的接口本身是完整的,而这一切是通过扩展函数完成。使用`Code Cleanup`迁移你的代码。
 
二、语言修改
一些语言修改的亮点,全部列表在此
很多之前是过时的现在已经变成错误,使用`Code Cleanup`来迁移。
 
1. When 表达式
这类代码已经证明是有问题的,所以我们决定让他过时。
when {
foo.isValid(), foo.isReady() -> process(foo)
...
}
很多人以为条件`foo.isValid(), foo.isReady()`代表foo是volid和read同时满足的,但是实际是这个逗号是表示`or`,解决方法十分简单:使用 `||`代替:
when{
foo.isValid() || foo.isReady() -> process(foo)
}
`Code Cleanup`将会迁移你的代码。
 
2. 注解
一个Bug被解决,他是防止我们以注解参数使用数组时为默认值:
annotation class Entry(val value: String)

annotation class Example(
val entries: Array<Entry> = arrayOf(Entry("a"), Entry("b")) // OK now
)
3.Enum.values()
最近,我们修改了传统的Java的`Enum.values()`成为一个属性:`Enum.values`,但是现在我们回滚这个修改。因为这里有一个不愉快的细节用例:在枚举中可能会有一个叫values的常量,同时这里没有办法做到二取一。我们考虑不同的意见后,决定在这次清理中将`values`更改回一个方法。
所以,`values`属性是过时的,`values()`方法是不过时的。
 
4.可见性与作用域规则
你们清理并修复了可见性和作用域规则,所以: 
  • pretected`成员在伴生对象是允许。
  • 从子类中调用伴生对象的非`@JvmStatic protected`成员会标记成错误(不支持)
  • 开放属性的`private`级别 setter 已经弃用。
  • 本地`sealed`类弃用(从来不是可用)
  • 覆盖setter不用削弱可见性
  • 内部类不再允许内嵌枚举中
  • 在lambda、对象常量、本地方法中使用没有初始化的变量是禁止的


三、 Android扩展
我们已经合并了`Kotlin plugin for IntelliJ IDEA`和`Kotlin Extensions For Android`插件。
同样,我们也增加了对Android的`product flavors`的支持,现在不同渠道的属性可以在不同的包中。
productFlavors {
free {
versionName "1.0-free"
}
pro {
versionName "1.0-pro"
}
}
例如,如果我们在build.gradle文件中有两个渠道。
我们现在不仅在`main`代码堆中的布局,同时在渠道布局中也能使用合并的属性。
// Import synthetic properties for the `activity_free.xml` layout in the `free` flavor
import kotlinx.android.synthetic.free.activity_free.versionMarker

class FreeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
...
setContentView(R.layout.activity_free)
...
versionMarker.text = "Free version"
}
}
注意,main代码集合堆中的布局现在都在`kotlinx.android.synthetic.main`包中,旧的命名约定已经过时。
 
四、IDE中有什么新的
1. Android的扩展插件已经合并到Kotlin插件中,不再需要单独安装。
2. 当新建一个Gradle项目时,我们已经添加一个Kotlin选项:
 
3. 调试:堆栈跟踪导航现在支持内联函数中的栈帧,同样步入内联函数时也有一些提高。
4. 增加了三种属性的快速修复

 5. 引入变量(Ctrl + Alt + V / Cmd + Alt + V)现在支持多声明表达式。

6. 同样他允许选择lambda表达式和匿名函数的容器

7. Beta3给String模板​片段带来引入变量、参数、属性、函数

8. 最后,一个试验性的特征已经添加——在IDE中添加对Kotlin脚本文件最基本的支持。
 
原文地址: http://blog.jetbrains.com/kotl ... -out/ 收起阅读 »