diff --git a/README.md b/README.md index 9b06fee..1523f19 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ public class StatefulUserWidget extends StatefulWidget { widget.setOnClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); + update(); } @Override @@ -307,13 +308,14 @@ ThreadPool.set(executorService); #### Widget #### -外部通过调用 `render` 方法,获得一个 View,进行渲染 +- render: 外部通过调用 `render` 方法,获得一个 View,进行渲染 +- update: 当 `StatefulWidget` 状态变更时,被动触发 #### StatelessWidget #### 需要实现一个 `Widget build()` 方法,来完成 `Widget` 的构建 ``` -render(first call) -> build -> widget.render -> initWidget -> update +render(first call) -> build -> widget.render -> initWidget ``` #### state #### @@ -328,7 +330,7 @@ onDestroy -> dispose 需要实现一个 `State createState(Context context)` 方法 来构建一个 `State` 对象 ``` -render(first call) -> createState -> state.init -> state.build -> widget.render -> initWidget -> update +render(first call) -> createState -> state.init -> state.build -> widget.render -> initWidget state.setState -> state.update -> widget.update ``` @@ -338,7 +340,7 @@ state.setState -> state.update -> widget.update ``` 构造方法 -> createView -render(first call) -> initView -> initEvent -> initData -> update +render(first call) -> initView -> initEvent -> initData ``` #### Lifecycle #### diff --git a/app/src/main/java/com/ittianyu/relight/base/_1/UserWidget.java b/app/src/main/java/com/ittianyu/relight/base/_1/UserWidget.java index bc0a6a4..796de3c 100644 --- a/app/src/main/java/com/ittianyu/relight/base/_1/UserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/base/_1/UserWidget.java @@ -38,6 +38,7 @@ public void initView(View view) { super.initView(view); tvId = view.findViewById(R.id.tv_id); tvName = view.findViewById(R.id.tv_name); + update(); } @Override diff --git a/app/src/main/java/com/ittianyu/relight/base/_2/StatefulUserWidget.java b/app/src/main/java/com/ittianyu/relight/base/_2/StatefulUserWidget.java index 9361b98..d801ccc 100644 --- a/app/src/main/java/com/ittianyu/relight/base/_2/StatefulUserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/base/_2/StatefulUserWidget.java @@ -10,7 +10,7 @@ import com.ittianyu.relight.widget.stateful.StatefulWidget; import com.ittianyu.relight.widget.stateful.state.State; -public class StatefulUserWidget extends StatefulWidget implements View.OnClickListener, Runnable { +public class StatefulUserWidget extends StatefulWidget { private UserBean user = UserDataSource.getInstance().getUser(); public StatefulUserWidget(Context context, Lifecycle lifecycle) { @@ -24,24 +24,15 @@ protected State createState(Context context) { @Override public void initWidget(UserWidget widget) { - widget.setOnClickListener(this); - } - - @Override - public void onClick(View v) { - setState(this); - } - - @Override - public void run() { - //UserBean data = UserDataSource.getInstance().getUser(); - //user.update(data); - user = UserDataSource.getInstance().getUser(); + widget.setOnClickListener(v -> setState(() -> { + user = UserDataSource.getInstance().getUser(); + })); + update(); } @Override public void update() { - super.update(); widget.setUser(user); + super.update(); } } diff --git a/app/src/main/java/com/ittianyu/relight/base/_4/StatefulUserWidget.java b/app/src/main/java/com/ittianyu/relight/base/_4/StatefulUserWidget.java index dc66166..06e5e83 100644 --- a/app/src/main/java/com/ittianyu/relight/base/_4/StatefulUserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/base/_4/StatefulUserWidget.java @@ -39,7 +39,7 @@ public void initWidget(LinearWidget widget) { .onClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); - + update(); } @Override diff --git a/app/src/main/java/com/ittianyu/relight/base/_5/StatefulUserWidget.java b/app/src/main/java/com/ittianyu/relight/base/_5/StatefulUserWidget.java index f40260f..07e583f 100644 --- a/app/src/main/java/com/ittianyu/relight/base/_5/StatefulUserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/base/_5/StatefulUserWidget.java @@ -41,7 +41,7 @@ public void initWidget(FrameWidget widget) { .onClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); - + update(); } @Override diff --git a/app/src/main/java/com/ittianyu/relight/base/_6/StatefulUserWidget.java b/app/src/main/java/com/ittianyu/relight/base/_6/StatefulUserWidget.java index ad69222..8e2d545 100644 --- a/app/src/main/java/com/ittianyu/relight/base/_6/StatefulUserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/base/_6/StatefulUserWidget.java @@ -59,7 +59,7 @@ public void initWidget(RelativeWidget widget) { .onClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); - + update(); } @Override diff --git a/app/src/main/java/com/ittianyu/relight/base/_7/StatefulUserWidget.java b/app/src/main/java/com/ittianyu/relight/base/_7/StatefulUserWidget.java index e53d66d..9430150 100644 --- a/app/src/main/java/com/ittianyu/relight/base/_7/StatefulUserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/base/_7/StatefulUserWidget.java @@ -39,7 +39,7 @@ public void initWidget(LinearWidget widget) { .onClickListener(v -> setStateAsync(() -> { user = UserDataSource.getInstance().getUserFromRemote(); })); - + update(); } @Override diff --git a/app/src/main/java/com/ittianyu/relight/common/datasource/UserDataSource.java b/app/src/main/java/com/ittianyu/relight/common/datasource/UserDataSource.java index 764f58f..6455da5 100644 --- a/app/src/main/java/com/ittianyu/relight/common/datasource/UserDataSource.java +++ b/app/src/main/java/com/ittianyu/relight/common/datasource/UserDataSource.java @@ -63,7 +63,7 @@ public List getUsersFromRemote() throws NetworkErrorException { } // mock empty and error - switch (random.nextInt(3)) { + switch (random.nextInt(4)) { case 0: {// empty return Collections.emptyList(); } diff --git a/app/src/main/java/com/ittianyu/relight/medium/_2/StatefulUserWidget.java b/app/src/main/java/com/ittianyu/relight/medium/_2/StatefulUserWidget.java index 08a0434..66e91a1 100644 --- a/app/src/main/java/com/ittianyu/relight/medium/_2/StatefulUserWidget.java +++ b/app/src/main/java/com/ittianyu/relight/medium/_2/StatefulUserWidget.java @@ -40,7 +40,7 @@ public void initWidget(LinearWidget widget) { .gravity(Gravity.CENTER) .matchParent() .onClickListener(v -> setStateAsync(updateTask)); - + update(); } @Override diff --git a/docs/base/1.AndroidWidget.md b/docs/base/1.AndroidWidget.md index b2c5cbb..ea0c825 100644 --- a/docs/base/1.AndroidWidget.md +++ b/docs/base/1.AndroidWidget.md @@ -131,6 +131,7 @@ public class UserWidget extends AndroidWidget { super.initView(view); tvId = view.findViewById(R.id.tv_id); tvName = view.findViewById(R.id.tv_name); + update(); } ``` diff --git a/docs/base/2.StatefulWidget.md b/docs/base/2.StatefulWidget.md index 9235552..bd9708d 100644 --- a/docs/base/2.StatefulWidget.md +++ b/docs/base/2.StatefulWidget.md @@ -217,18 +217,22 @@ public class WidgetActivity extends AppCompatActivity { ``` 然后重写 `StatefulUserWidget` 的 `initWidget` 和 `update` + +有一点需要注意,`Stateful` 和 `Stateless` 都是先更新内部的 widget,在更新自己。 +所以,这里需要在更新内部 widget 之前设置数据,所以一定要把 `super.update();` 放到后面执行。 ``` @Override public void initWidget(UserWidget widget) { widget.setOnClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); + update(); } @Override public void update() { - super.update(); widget.setUser(user); + super.update(); } ``` diff --git a/docs/base/4.LinearWidget.md b/docs/base/4.LinearWidget.md index 557934e..8965300 100644 --- a/docs/base/4.LinearWidget.md +++ b/docs/base/4.LinearWidget.md @@ -58,6 +58,7 @@ StatefulWidget .onClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); + update(); } ``` diff --git a/docs/base/5.FrameWidget.md b/docs/base/5.FrameWidget.md index b26f604..b7b3375 100644 --- a/docs/base/5.FrameWidget.md +++ b/docs/base/5.FrameWidget.md @@ -61,6 +61,7 @@ StatefulWidget .onClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); + update(); } ``` diff --git a/docs/base/6.RelativeWidget.md b/docs/base/6.RelativeWidget.md index 9946315..a83a734 100644 --- a/docs/base/6.RelativeWidget.md +++ b/docs/base/6.RelativeWidget.md @@ -102,6 +102,7 @@ StatefulWidget .onClickListener(v -> setState(() -> { user = UserDataSource.getInstance().getUser(); })); + update(); } ``` diff --git a/lib/src/main/java/com/ittianyu/relight/widget/native_/AndroidWidget.java b/lib/src/main/java/com/ittianyu/relight/widget/native_/AndroidWidget.java index fbbdcba..ffe5d13 100644 --- a/lib/src/main/java/com/ittianyu/relight/widget/native_/AndroidWidget.java +++ b/lib/src/main/java/com/ittianyu/relight/widget/native_/AndroidWidget.java @@ -35,7 +35,6 @@ private void init() { initView(view); initEvent(view); initData(); - update(); } @Override diff --git a/lib/src/main/java/com/ittianyu/relight/widget/stateful/StatefulWidget.java b/lib/src/main/java/com/ittianyu/relight/widget/stateful/StatefulWidget.java index 6073eca..7f81f72 100644 --- a/lib/src/main/java/com/ittianyu/relight/widget/stateful/StatefulWidget.java +++ b/lib/src/main/java/com/ittianyu/relight/widget/stateful/StatefulWidget.java @@ -39,7 +39,6 @@ public V render() { if (view == null) throw new IllegalStateException("can't render view"); initWidget(widget); - update(); if (lifecycle != null) { lifecycle.addObserver(this); } diff --git a/lib/src/main/java/com/ittianyu/relight/widget/stateful/lcee/LceeWidget.java b/lib/src/main/java/com/ittianyu/relight/widget/stateful/lcee/LceeWidget.java index 3b744f6..1f6fede 100644 --- a/lib/src/main/java/com/ittianyu/relight/widget/stateful/lcee/LceeWidget.java +++ b/lib/src/main/java/com/ittianyu/relight/widget/stateful/lcee/LceeWidget.java @@ -61,8 +61,8 @@ public void initWidget(FrameWidget widget) { @Override public void update() { - super.update(); updateWidget(); + super.update(); } @Override diff --git a/lib/src/main/java/com/ittianyu/relight/widget/stateful/lceerm/LceermWidget.java b/lib/src/main/java/com/ittianyu/relight/widget/stateful/lceerm/LceermWidget.java index 525e9c6..89dcb34 100644 --- a/lib/src/main/java/com/ittianyu/relight/widget/stateful/lceerm/LceermWidget.java +++ b/lib/src/main/java/com/ittianyu/relight/widget/stateful/lceerm/LceermWidget.java @@ -89,8 +89,8 @@ public void initWidget(FrameWidget widget) { @Override public void update() { - super.update(); updateWidget(); + super.update(); } @Override diff --git a/lib/src/main/java/com/ittianyu/relight/widget/stateful/rm/RmWidget.java b/lib/src/main/java/com/ittianyu/relight/widget/stateful/rm/RmWidget.java index 6ff4b2f..b795f5a 100644 --- a/lib/src/main/java/com/ittianyu/relight/widget/stateful/rm/RmWidget.java +++ b/lib/src/main/java/com/ittianyu/relight/widget/stateful/rm/RmWidget.java @@ -47,8 +47,8 @@ protected State createState(Context context) { @Override public void update() { - super.update(); updateWidget(); + super.update(); } private void updateWidget() { diff --git a/lib/src/main/java/com/ittianyu/relight/widget/stateless/StatelessWidget.java b/lib/src/main/java/com/ittianyu/relight/widget/stateless/StatelessWidget.java index e41fe59..9b9ed3f 100644 --- a/lib/src/main/java/com/ittianyu/relight/widget/stateless/StatelessWidget.java +++ b/lib/src/main/java/com/ittianyu/relight/widget/stateless/StatelessWidget.java @@ -31,7 +31,6 @@ public V render() { if (view == null) throw new IllegalStateException("can't render view"); initWidget(widget); - update(); if (lifecycle != null) { lifecycle.addObserver(this); }