Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/BennyWang/KBinding
Android MVVM framework write in kotlin, develop Android has never been so fun.
https://github.com/BennyWang/KBinding
Last synced: 12 days ago
JSON representation
Android MVVM framework write in kotlin, develop Android has never been so fun.
- Host: GitHub
- URL: https://github.com/BennyWang/KBinding
- Owner: BennyWang
- Created: 2015-11-12T11:09:01.000Z (almost 9 years ago)
- Default Branch: develop
- Last Pushed: 2017-05-19T08:29:20.000Z (over 7 years ago)
- Last Synced: 2024-08-01T01:30:53.463Z (3 months ago)
- Language: Kotlin
- Homepage:
- Size: 697 KB
- Stars: 409
- Watchers: 22
- Forks: 44
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-kotlin-android - KBinding - Android MVVM framework write in kotlin. (Libraries)
- awesome-kotlin - KBinding - Android MVVM framework write in kotlin. (Libraries)
- awesome-kotlin-android - KBinding - 使用kotlin实现的Android MVVM框架 🔥🔥 (开源库 / 框架)
- awesome-kotlin-libraries-for-android - KBinding - Android View Model binding framework write in kotlin, base on anko, simple but powerful. (<a name="ui"></a>UI <sup>[Back ⇈](#contents)</sup>)
- awesome - KBinding - Android MVVM framework write in kotlin, develop Android has never been so fun. (etc)
- awesome - KBinding - Android MVVM framework write in kotlin, develop Android has never been so fun. (etc)
README
KBinding
======================
[中文版](https://github.com/EndSmile/KBinding/blob/develop/README_CN.md)Android MVVM framework write in kotlin, base on anko, simple but powerful.
It depends on my another project [AutoAdapter](https://github.com/BennyWang/AutoAdapter)(A library for simplifying adapter creation)## Contents
### BindingMode
- 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
```kotlin
verticalLayout {
editText {
bind { text("name", mode = TwoWay) }
}
button {
bind { click("hello") }
}
}
class SimpleViewModel() : ViewModel() {
@delegate:Property
var name: String by Delegates.property("Jason")
// all the parameter for Command is optional, first parameter pass by event Observable, second parameter is lambda (Boolean) -> Unit
@Command
val hello(canExecute: (Boolean) -> Unit) {
toast("Hello, ${name}!")
}
}
```### Multiple Binding
```kotlin
//login button enabled only when name and password not empty
class ArrayToBooleanConverter : MultipleConverter {
override fun convert(params: Array): 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() {
@delegate:Property
var name: String by Delegates.property("[email protected]")
@delegate:Property
var password: String by Delegates.property("xxxxxx")
@Command
val login() {
//login processing
}
}
```### DependencyProperty and ExtractProperty
```kotlin
// @DependencyProperty will generate binding for nameAndSymbol depends on stock, stock changes then nameAndSymbol changes
// @ExtractProperty will generate binding for stock properties, for example code below, Property name and price will generated. If hasPrefix = true, then Property stock.name stock.price will generated.
class StockViewModel() : ViewModel() {
@delegate:ExtractProperty(
"name", "price",
hasPrefix = false
)
var stock: Stock? by Delegates.property()
@delegate:DependencyProperty("stock")
var nameAndSymbol: String by Delegates.property { stock?.name + stock?.symbol }
}
```### Wait/Until
```kotlin
//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 PropertyEvent
```kotlin
fun View.click(path: String) : PropertyBinding = commandBinding(path, clicks(), enabled())
```Property
```kotlin
fun View.enabled(vararg paths: String, mode: OneWay = BindingMode.OneWay, converter: OneWayConverter = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(paths, enabled(), false, converter)
//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 = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(paths, text(), false, converter)
fun TextView.text(vararg paths: String, mode: OneTime, converter: OneWayConverter = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(paths, text(), true, converter)
fun TextView.text(path: String, mode: OneWayToSource, converter: OneWayConverter<*> = EmptyOneWayConverter()) : PropertyBinding = oneWayPropertyBinding(path, textChanges2(), converter)
fun TextView.text(path: String, mode: TwoWay, converter: TwoWayConverter = EmptyTwoWayConverter()) : PropertyBinding = twoWayPropertyBinding(path, textChanges2(), text(), converter)
```## Using with Gradle
```gradledependencies {
compile 'com.benny.library:kbinding:0.2.3'
kapt 'com.benny.library:kbinding-compiler:0.2.3'
// for common bindings, View, TextView, and ...
compile 'com.benny.library:kbinding-common:0.2.3'
// for recyclerview bindings
compile 'com.benny.library:kbinding-adapterview:0.2.3'
// for support v4 bindings
compile 'com.benny.library:kbinding-support-v4:0.2.3'
}
```## 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