Skip to content

Latest commit

 

History

History
167 lines (137 loc) · 6.47 KB

README_CN.md

File metadata and controls

167 lines (137 loc) · 6.47 KB

README

Apache 2.0 License Release Join the chat at https://gitter.im/nekocode/kotgo

快速创建模板项目

你可以使用下面的命令快速创建一个 Kotgo 模板项目。只需要粘贴到命令行中执行就可以了。

python -c "$(curl -fsSL https://raw.githubusercontent.com/nekocode/kotgo/master/project_creator.py)"

当然,你也可以将这个 Python 脚本下载到你本地运行。它依赖 requests 库。

相关文章

为什么使用 Kotlin

为什么使用 MVP

为什么使用 Rx

描述

Kotgo 是一个采用 MVP 模式进行设计的 Android 应用框架。它使用纯的 Kotlin 进行构建。

包结构

com.nekocode.baseframework
├─ data
│  ├─ dto
│  ├─ exception
│  ├─ model
│  └─ service
│ 
├─ ui
│  └─ screen_one
│     ├─ Presenter.kt
│     └─ Activity.kt
│
└─ App.kt

分层

  • **Data Layer:**非传统意义的 Model 层,包含 dto(Data Transfer Object)、servicemodelexception 等。其中 service 包含 Net 等不同服务,用于从不同途径获取数据。model 负责处理某个业务对象的业务逻辑,并通过 dto 或基本类型 与 Presenter 层进行交互(建议使用 RxJava)。
  • **View Layer:**视图层,包括各种 activityadapterfragmentview。只关注与用户交互,以及视图操作(动画、界面输出、更新等)。
  • Presenter Layer:控制逻辑层。是「Model 与 View 层中间的交互控制层」

Kotlin

  • kotlin version: 1.0.2

依赖库

  • anko: 0.8.3
  • rxkotlin: 0.55.0
  • retrofit: 2.0.2
  • picasso: 2.5.2
  • hawk: 1.23
  • stetho: 1.3.1
  • paperparcel: 1.0.0-rc4

截图

感谢 gank.io。Sample App 是在它上面获取美女照片信息的。

另外一个更完善的例子:查看这里

使用 Component Library

你可以仅仅使用 kotgo 的 component 库,它提供了很多能让你简单快速地构建一个 MVP 项目的有用的工具。在项目根目录的 build.gradle 添加以下内容:

repositories {
    maven { url "https://jitpack.io" }
}

在你的子 build.gradle 添加以下依赖:

dependencies {
    compile 'com.github.nekocode:kotgo:<lastest-version>'
}

更灵活的 RxLifecycle!!

它帮助你将 RxJava 的订阅绑定在 Avtivity 或者 Fragment 的生命周期上。它会在 Activity 或者 Fragment 进行销毁的时候终止订阅。更关键的是,他还能在任何地方使用(例如 Presenter 中),比 RxLifecycle 更加灵活。

MeiziModel.getMeizis(50, 1).onUI().bindLifecycle(view).subscribe {
    view.refreshMeizis(it)
}

强大的 RxBus!!

它使用 RxJava 来模拟事件总线,它通过一系列 Kotlin 的语法糖,将订阅 EventBus 变得十分简洁,并且自动绑定了 Avtivity 或者 Fragment 的生命周期,你无需担心任何意外!只需要像下面一样在 bus 中订阅事件就行了。

bus {
    subscribe(String::class.java) {
        showToast(it)
    }
    
    subscribe(Int::class.java) {
        showToast(it.toString())
    }
}

继承自 Fragment 的 Presenter!!

使用 Fragment 来实现 Presenter 是最好的方式之一! 我们现在能将原先在 Activity 中的各种依赖 Activity 生命周期的逻辑迁移到 Presenter 中了,并且还能够使用 setRetainInstance(true) 来处理屏幕旋转的问题。

它看起来是这样的:

class MeiziPresenter(): BasePresenter(), Contract.Presenter {
    var view: Contract.View? = null

    override fun onAttach(activity: Activity?) {
        super.onAttach(activity)
        view = getParent() as Contract.View
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        MeiziModel.getMeizis(50, 1).onUI().bindLifecycle(this).subscribe {
            view?.refreshMeizis(it)
        }
    }
}

简单的依赖注入!!

查看 这里的代码

我们可以继承一个 Dependency 类来储存一些依赖生成。

object TestDep : Dependency() {
    override fun createDependencies() {
        bindSingleton<Int> {
            args ->
            args[0] as Int
        }
    }
}

然后在需要的时候注入的地方使用下面的代码:

val int = TestDep.inject<Int>(1)

支持单个 Activity 多个 Fragment 架构!!

你可以借助 Component 库提供的 FragmentActivity 来构建只有单个 Activity 的应用,它非常适合页面层次结构不深的应用。

FragmentActivity 提供了以下的一些方法来帮助你管理 Fragment 栈。

push(fragmentTag, classType, args)
pushForResult(originalTag, requestCode, fragmentTag, classType, args)
pop()
get(fragmentTag)
getFragmentTopInStack()
startActivityForResult(fragmentTag, intent, requestCode, options)

我们还处理了更多的细节,详情可以查看 FragmentActivity.kt

其他

它还包括一些其他常用的工具和拓展(例如 KotterKnife)。你可以通过查看 util 包 获得更多的细节。