Showing
1 changed file
with
20 additions
and
20 deletions
@@ -59,11 +59,11 @@ var name = 'Jonatas Borges'.obs; | @@ -59,11 +59,11 @@ var name = 'Jonatas Borges'.obs; | ||
59 | 59 | ||
60 | 就这么简单! | 60 | 就这么简单! |
61 | 61 | ||
62 | -我们把这个reactive-".obs"(ervables)变量称为_Rx_。 | 62 | +我们把这个reactive-".obs"(ervables)变量称为 _Rx_ 。 |
63 | 63 | ||
64 | 我们做了什么?我们创建了一个 "Stream "的 "String",分配了初始值 "Jonatas Borges",我们通知所有使用 "Jonatas Borges "的widgets,它们现在 "属于 "这个变量,当_Rx_的值发生变化时,它们也要随之改变。 | 64 | 我们做了什么?我们创建了一个 "Stream "的 "String",分配了初始值 "Jonatas Borges",我们通知所有使用 "Jonatas Borges "的widgets,它们现在 "属于 "这个变量,当_Rx_的值发生变化时,它们也要随之改变。 |
65 | 65 | ||
66 | -这就是GetX**的**魔力,这要归功于Dart的能力。 | 66 | +这就是GetX **的** 魔力,这要归功于Dart的能力。 |
67 | 67 | ||
68 | 但是,我们知道,一个`Widget`只有在函数里面才能改变,因为静态类没有 "自动改变 "的能力。 | 68 | 但是,我们知道,一个`Widget`只有在函数里面才能改变,因为静态类没有 "自动改变 "的能力。 |
69 | 69 | ||
@@ -80,15 +80,15 @@ var name = 'Jonatas Borges'.obs; | @@ -80,15 +80,15 @@ var name = 'Jonatas Borges'.obs; | ||
80 | Obx (() => Text (controller.name)); | 80 | Obx (() => Text (controller.name)); |
81 | ``` | 81 | ``` |
82 | 82 | ||
83 | -_你只需记住 `Obx(()=>` | 83 | +你只需记住 `Obx(()=>` |
84 | 84 | ||
85 | -你只需将Widget通过一个箭头函数传递给 `Obx()`(_Rx_的 "观察者")。 | 85 | +你只需将Widget通过一个箭头函数传递给 `Obx()`( _Rx_ 的 "观察者")。 |
86 | 86 | ||
87 | `Obx`是相当聪明的,只有当`controller.name`的值发生变化时才会改变。 | 87 | `Obx`是相当聪明的,只有当`controller.name`的值发生变化时才会改变。 |
88 | 88 | ||
89 | 如果`name`是`"John"`,你把它改成了`"John"`(`name.value="John"`),因为它和之前的`value`是一样的,所以界面上不会有任何变化,而`Obx`为了节省资源,会直接忽略新的值,不重建Widget。**这是不是很神奇**? | 89 | 如果`name`是`"John"`,你把它改成了`"John"`(`name.value="John"`),因为它和之前的`value`是一样的,所以界面上不会有任何变化,而`Obx`为了节省资源,会直接忽略新的值,不重建Widget。**这是不是很神奇**? |
90 | 90 | ||
91 | -> 那么,如果我在一个`Obx`里有5个_Rx_(可观察的)变量呢? | 91 | +> 那么,如果我在一个`Obx`里有5个 _Rx_ (可观察的)变量呢? |
92 | 92 | ||
93 | 当其中**任何**一个变量发生变化时,它就会更新。 | 93 | 当其中**任何**一个变量发生变化时,它就会更新。 |
94 | 94 | ||
@@ -96,7 +96,7 @@ _你只需记住 `Obx(()=>` | @@ -96,7 +96,7 @@ _你只需记住 `Obx(()=>` | ||
96 | 96 | ||
97 | 不会,只会更新使用那个 _Rx_ 变量的**特定 Widget**。 | 97 | 不会,只会更新使用那个 _Rx_ 变量的**特定 Widget**。 |
98 | 98 | ||
99 | -所以,只有当_Rx_变量的值发生变化时,**GetX**才会更新界面。 | 99 | +所以,只有当 _Rx_ 变量的值发生变化时,**GetX**才会更新界面。 |
100 | 100 | ||
101 | ``` | 101 | ``` |
102 | final isOpen = false.obs; | 102 | final isOpen = false.obs; |
@@ -114,13 +114,13 @@ void onButtonTap() => isOpen.value=false; | @@ -114,13 +114,13 @@ void onButtonTap() => isOpen.value=false; | ||
114 | 114 | ||
115 | 如果你需要一个**强大的**状态管理器,用**GetX**是不会错的。 | 115 | 如果你需要一个**强大的**状态管理器,用**GetX**是不会错的。 |
116 | 116 | ||
117 | -它不能和变量一起工作,除了__flows__,它里面的东西本质都是`Streams`。 | ||
118 | -你可以将_rxDart_与它结合使用,因为所有的东西都是`Streams`。 | ||
119 | -你可以监听每个"_Rx_变量 "的 "事件"。 | 117 | +它不能和变量一起工作,除了 __flows__ ,它里面的东西本质都是`Streams`。 |
118 | +你可以将 _rxDart_ 与它结合使用,因为所有的东西都是`Streams`。 | ||
119 | +你可以监听每个" _Rx_ 变量 "的 "事件"。 | ||
120 | 因为里面的所有东西都是 "Streams"。 | 120 | 因为里面的所有东西都是 "Streams"。 |
121 | 121 | ||
122 | -这实际上是一种_BLoC_方法,比_MobX_更容易,而且没有代码生成器或装饰。 | ||
123 | -你可以把**任何东西**变成一个_"Observable"_,只需要在它末尾加上`.obs`。 | 122 | +这实际上是一种 _BLoC_ 方法,比 _MobX_ 更容易,而且没有代码生成器或装饰。 |
123 | +你可以把**任何东西**变成一个 _"Observable"_ ,只需要在它末尾加上`.obs`。 | ||
124 | 124 | ||
125 | ### 最高性能 | 125 | ### 最高性能 |
126 | 126 | ||
@@ -129,8 +129,8 @@ void onButtonTap() => isOpen.value=false; | @@ -129,8 +129,8 @@ void onButtonTap() => isOpen.value=false; | ||
129 | 如果你的应用程序中遇到错误,并发送重复的状态变更,**GetX**将确保它不会崩溃。 | 129 | 如果你的应用程序中遇到错误,并发送重复的状态变更,**GetX**将确保它不会崩溃。 |
130 | 130 | ||
131 | 使用**GetX**,只有当`value`改变时,状态才会改变。 | 131 | 使用**GetX**,只有当`value`改变时,状态才会改变。 |
132 | -这就是**GetX**,和使用MobX_的_`computed`的主要区别。 | ||
133 | -当加入两个__observable__,其中一个发生变化时,该_observable_的监听器也会发生变化。 | 132 | +这就是**GetX**,和使用MobX _的_ `computed`的主要区别。 |
133 | +当加入两个 __observable__ ,其中一个发生变化时,该 _observable_ 的监听器也会发生变化。 | ||
134 | 134 | ||
135 | 使用**GetX**,如果你连接了两个变量,`GetX()`(类似于`Observer()`)只有在它的状态真正变化时才会重建。 | 135 | 使用**GetX**,如果你连接了两个变量,`GetX()`(类似于`Observer()`)只有在它的状态真正变化时才会重建。 |
136 | 136 | ||
@@ -183,13 +183,13 @@ final user = User().obs; | @@ -183,13 +183,13 @@ final user = User().obs; | ||
183 | 183 | ||
184 | ##### 有一个反应的状态,很容易。 | 184 | ##### 有一个反应的状态,很容易。 |
185 | 185 | ||
186 | -我们知道,_Dart_现在正朝着_null safety_的方向发展。 | ||
187 | -为了做好准备,从现在开始,你应该总是用一个**初始值**来开始你的_Rx_变量。 | 186 | +我们知道, _Dart_ 现在正朝着 _null safety_ 的方向发展。 |
187 | +为了做好准备,从现在开始,你应该总是用一个**初始值**来开始你的 _Rx_ 变量。 | ||
188 | 188 | ||
189 | -> 用**GetX**将一个变量转化为一个_observable_ + _initial value_是最简单,也是最实用的方法。 | 189 | +> 用**GetX**将一个变量转化为一个 _observable_ + _initial value_ 是最简单,也是最实用的方法。 |
190 | 190 | ||
191 | 你只需在变量的末尾添加一个"`.obs`",即可把它变成可观察的变量, | 191 | 你只需在变量的末尾添加一个"`.obs`",即可把它变成可观察的变量, |
192 | -然后它的`.value`就是_初始值_)。 | 192 | +然后它的`.value`就是 _初始值_ )。 |
193 | 193 | ||
194 | 194 | ||
195 | ### 使用视图中的值 | 195 | ### 使用视图中的值 |
@@ -411,17 +411,17 @@ interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); | @@ -411,17 +411,17 @@ interval(count1, (_) => print("interval $_"), time: Duration(seconds: 1)); | ||
411 | 所有worker都会返回一个`Worker`实例,你可以用它来取消(通过`dispose()`)worker。 | 411 | 所有worker都会返回一个`Worker`实例,你可以用它来取消(通过`dispose()`)worker。 |
412 | 412 | ||
413 | - **`ever`** | 413 | - **`ever`** |
414 | - 每当_Rx_变量发出一个新的值时,就会被调用。 | 414 | + 每当 _Rx_ 变量发出一个新的值时,就会被调用。 |
415 | 415 | ||
416 | - **`everAll`** | 416 | - **`everAll`** |
417 | - 和 "ever "很像,但它需要一个_Rx_值的 "List",每次它的变量被改变时都会被调用。就是这样。 | 417 | + 和 "ever "很像,但它需要一个 _Rx_ 值的 "List",每次它的变量被改变时都会被调用。就是这样。 |
418 | 418 | ||
419 | 419 | ||
420 | - **`once`** | 420 | - **`once`** |
421 | 'once'只在变量第一次被改变时被调用。 | 421 | 'once'只在变量第一次被改变时被调用。 |
422 | 422 | ||
423 | - **`debounce`** | 423 | - **`debounce`** |
424 | -debounce'在搜索函数中非常有用,你只希望API在用户完成输入时被调用。如果用户输入 "Jonny",你将在API中进行5次搜索,分别是字母J、o、n、n和y。使用Get不会发生这种情况,因为你将有一个 "debounce "Worker,它只会在输入结束时触发。 | 424 | +'debounce'在搜索函数中非常有用,你只希望API在用户完成输入时被调用。如果用户输入 "Jonny",你将在API中进行5次搜索,分别是字母J、o、n、n和y。使用Get不会发生这种情况,因为你将有一个 "debounce "Worker,它只会在输入结束时触发。 |
425 | 425 | ||
426 | - **`interval`** | 426 | - **`interval`** |
427 | 'interval'与debouce不同,debouce如果用户在1秒内对一个变量进行了1000次修改,他将在规定的计时器(默认为800毫秒)后只发送最后一次修改。Interval则会忽略规定时间内的所有用户操作。如果你发送事件1分钟,每秒1000个,那么当用户停止DDOS事件时,debounce将只发送最后一个事件。建议这样做是为了避免滥用,在用户可以快速点击某样东西并获得一些好处的功能中(想象一下,用户点击某样东西可以赚取硬币,如果他在同一分钟内点击300次,他就会有300个硬币,使用间隔,你可以设置时间范围为3秒,无论是点击300次或100万次,1分钟内他最多获得20个硬币)。debounce适用于防DDOS,适用于搜索等功能,每次改变onChange都会调用你的api进行查询。Debounce会等待用户停止输入名称,进行请求。如果在上面提到的投币场景中使用它,用户只会赢得1个硬币,因为只有当用户 "暂停 "到既定时间时,它才会被执行。 | 427 | 'interval'与debouce不同,debouce如果用户在1秒内对一个变量进行了1000次修改,他将在规定的计时器(默认为800毫秒)后只发送最后一次修改。Interval则会忽略规定时间内的所有用户操作。如果你发送事件1分钟,每秒1000个,那么当用户停止DDOS事件时,debounce将只发送最后一个事件。建议这样做是为了避免滥用,在用户可以快速点击某样东西并获得一些好处的功能中(想象一下,用户点击某样东西可以赚取硬币,如果他在同一分钟内点击300次,他就会有300个硬币,使用间隔,你可以设置时间范围为3秒,无论是点击300次或100万次,1分钟内他最多获得20个硬币)。debounce适用于防DDOS,适用于搜索等功能,每次改变onChange都会调用你的api进行查询。Debounce会等待用户停止输入名称,进行请求。如果在上面提到的投币场景中使用它,用户只会赢得1个硬币,因为只有当用户 "暂停 "到既定时间时,它才会被执行。 |
-
Please register or login to post a comment