zl.kou

fix: fix chinese translation format of state_management.md

@@ -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个硬币,因为只有当用户 "暂停 "到既定时间时,它才会被执行。