Skip to content

Commit

Permalink
add method "initWidget" "updateWidget" for StatefullWidget. Add doc 1…
Browse files Browse the repository at this point in the history
… and 2.
  • Loading branch information
ItTianYuStudio committed Nov 4, 2018
1 parent 387c27a commit b30a67c
Show file tree
Hide file tree
Showing 31 changed files with 902 additions and 88 deletions.
33 changes: 25 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

![](./images/mvvm.png)

## 优势 ##

#### 轻量 ####
Expand Down Expand Up @@ -129,7 +131,7 @@ allprojects {
def support_version = '28.0.0'
def lifecycle_version = '1.1.1'
implementation 'com.github.ittianyu:relight:0.0.3'
implementation 'com.github.ittianyu:relight:0.0.4'
implementation "com.android.support:appcompat-v7:$support_version"
implementation "com.android.support:design:$support_version"
Expand Down Expand Up @@ -369,9 +371,27 @@ ThreadPool.set(executorService);
#### StatelessWidget ####
需要实现一个 Widget<T> build() 方法,来完成 Widget 的构建

```
render -> build -> initWidget -> widget.render
```

#### state ####

```
setState -> willUpdate -> update -> didUpdate
onDestroy -> dispose
```

#### StatefulWidget ####
需要实现一个 State<T> createState(Context context) 方法 来构建一个 State 对象

```
render -> createState -> state.init -> state.build -> initWidget -> widget.render
state.setState -> state.update -> update -> updateWidget
```

#### AndroidWidget ####
带有 Android 常用的构建方法 和 生命周期

Expand Down Expand Up @@ -402,22 +422,19 @@ initView -> initProps -> updateProps

#### ViewGroupWidget ####

构造方法 -> addChildren -> updateChildrenProps && updateProps
构造方法 -> addChildren -> updateChildrenProps -> updateProps

updaetView 中,调用 children 的 updateView 或 setState 或 update 方法


## 入门教程 ##

#### 1. BaseAndroidWidget ####
#### [1. AndroidWidget](./docs/1.AndroidWidget.md) ####

目的:学习 BaseAndroidWidget 的简单用法。
计划:用 xml 方式创建 view 进行渲染
目的:学习 AndroidWidget 的简单用法。

#### 2. LifecycleStatefulWidget ####
#### [2. LifecycleStatefulWidget](./docs/2.LifecycleStatefulWidget.md) ####

目的:学习 LifecycleStatefulWidget 的简单用法。
计划:使用 StateUtils 去创建 state,传入第一篇中写好的 widget 进行渲染。为 view 添加一个点击事件,在事件中,调用 setState 修改数据,实现UI刷新。

#### 3. TextWidget ####

Expand Down
6 changes: 6 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,10 @@ dependencies {
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"

implementation project(':lib')


debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.2'
}
6 changes: 4 additions & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ittianyu.relight">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name="android.support.multidex.MultiDexApplication"
android:name=".MainApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
Expand All @@ -19,6 +19,8 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="._1.WidgetActivity"></activity>
<activity android:name="._2.WidgetActivity" />
</application>

</manifest>
32 changes: 32 additions & 0 deletions app/src/main/java/com/ittianyu/relight/MainActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.ittianyu.relight;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void onClick(View v) {
switch (v.getId()) {
case R.id._1_AndroidWidget:
start(com.ittianyu.relight._1.WidgetActivity.class);
break;
case R.id._2_LifecycleStatefulWidget:
start(com.ittianyu.relight._2.WidgetActivity.class);
break;

}
}

private void start(Class<? extends Activity> activity) {
startActivity(new Intent(this, activity));
}
}
27 changes: 27 additions & 0 deletions app/src/main/java/com/ittianyu/relight/MainApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.ittianyu.relight;

import android.app.Application;
import android.content.Context;
import android.support.multidex.MultiDex;

import com.squareup.leakcanary.LeakCanary;

public class MainApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
}

protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}

}
40 changes: 40 additions & 0 deletions app/src/main/java/com/ittianyu/relight/_1/UserWidget.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.ittianyu.relight._1;

import android.arch.lifecycle.Lifecycle;
import android.content.Context;
import android.view.View;
import android.widget.TextView;

import com.ittianyu.relight.R;
import com.ittianyu.relight.common.bean.UserBean;
import com.ittianyu.relight.widget.native_.AndroidWidget;

public class UserWidget extends AndroidWidget<View> {
private TextView tvId;
private TextView tvName;
private UserBean user;

public UserWidget(Context context, Lifecycle lifecycle, UserBean user) {
super(context, lifecycle);
this.user = user;
}

@Override
public View createView(Context context) {
return View.inflate(context, R.layout.activity_user, null);
}

@Override
public void initView(View view) {
super.initView(view);
tvId = view.findViewById(R.id.tv_id);
tvName = view.findViewById(R.id.tv_name);
}

@Override
public void updateView(View view) {
super.updateView(view);
tvId.setText(user.getId() + "");
tvName.setText(user.getName());
}
}
20 changes: 20 additions & 0 deletions app/src/main/java/com/ittianyu/relight/_1/WidgetActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.ittianyu.relight._1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.ittianyu.relight.common.bean.UserBean;
import com.ittianyu.relight.utils.WidgetUtils;

public class WidgetActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UserBean user = new UserBean(1, "ittianyu");
View root = WidgetUtils.render(this, UserWidget.class, user);
// View root = new UserWidget(this, getLifecycle(), user).render(); // this is ok too
setContentView(root);
}
}
38 changes: 38 additions & 0 deletions app/src/main/java/com/ittianyu/relight/_2/StatefulUserWidget.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.ittianyu.relight._2;

import android.arch.lifecycle.Lifecycle;
import android.content.Context;
import android.view.View;

import com.ittianyu.relight.common.bean.UserBean;
import com.ittianyu.relight.common.datasource.UserDataSource;
import com.ittianyu.relight.utils.StateUtils;
import com.ittianyu.relight.widget.stateful.AsyncState;
import com.ittianyu.relight.widget.stateful.LifecycleStatefulWidget;

public class StatefulUserWidget extends LifecycleStatefulWidget<View, UserWidget> {
private UserBean user = UserDataSource.getInstance().getUser();

public StatefulUserWidget(Context context, Lifecycle lifecycle) {
super(context, lifecycle);
}

@Override
protected AsyncState<UserWidget> createState(Context context) {
return StateUtils.create(new UserWidget(context, lifecycle, user));
}

@Override
public void initWidget(UserWidget widget) {
widget.setOnClickListener(v -> setState(() -> {
// UserBean data = UserDataSource.getInstance().getUser();
// user.update(data);
user = UserDataSource.getInstance().getUser();
}));
}

@Override
public void updateWidget(UserWidget widget) {
widget.setUser(user);
}
}
48 changes: 48 additions & 0 deletions app/src/main/java/com/ittianyu/relight/_2/UserWidget.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.ittianyu.relight._2;

import android.arch.lifecycle.Lifecycle;
import android.content.Context;
import android.view.View;
import android.widget.TextView;

import com.ittianyu.relight.R;
import com.ittianyu.relight.common.bean.UserBean;
import com.ittianyu.relight.widget.native_.AndroidWidget;

public class UserWidget extends AndroidWidget<View> {
private TextView tvId;
private TextView tvName;
private UserBean user;

public UserWidget(Context context, Lifecycle lifecycle, UserBean user) {
super(context, lifecycle);
this.user = user;
}

@Override
public View createView(Context context) {
return View.inflate(context, R.layout.activity_user, null);
}

@Override
public void initView(View view) {
super.initView(view);
tvId = view.findViewById(R.id.tv_id);
tvName = view.findViewById(R.id.tv_name);
}

@Override
public void updateView(View view) {
super.updateView(view);
tvId.setText(user.getId() + "");
tvName.setText(user.getName());
}

public void setOnClickListener(View.OnClickListener listener) {
view.setOnClickListener(listener);
}

public void setUser(UserBean user) {
this.user = user;
}
}
16 changes: 16 additions & 0 deletions app/src/main/java/com/ittianyu/relight/_2/WidgetActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.ittianyu.relight._2;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.ittianyu.relight.utils.WidgetUtils;

public class WidgetActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View root = WidgetUtils.render(this, StatefulUserWidget.class);
setContentView(root);
}
}
45 changes: 45 additions & 0 deletions app/src/main/java/com/ittianyu/relight/common/bean/UserBean.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.ittianyu.relight.common.bean;

import java.io.Serializable;

public class UserBean implements Serializable {
private Integer id;
private String name;

public UserBean() {
}

public UserBean(Integer id, String name) {
this.id = id;
this.name = name;
}

public void update(UserBean bean) {
setId(bean.id);
setName(bean.name);
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "UserBean{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
Loading

0 comments on commit b30a67c

Please sign in to comment.