Committed by
GitHub
Merge pull request #959 from nivisi/update-readme-ru
Translate code commentaries in the RU Readme
Showing
1 changed file
with
128 additions
and
126 deletions
@@ -121,28 +121,28 @@ class Home extends StatelessWidget { | @@ -121,28 +121,28 @@ class Home extends StatelessWidget { | ||
121 | @override | 121 | @override |
122 | Widget build(context) { | 122 | Widget build(context) { |
123 | 123 | ||
124 | - // Instantiate your class using Get.put() to make it available for all "child" routes there. | 124 | + // Создайте экземпляр вашего класса с помощью Get.put(), чтобы сделать его доступным для всех "дочерних" маршрутов. |
125 | final Controller c = Get.put(Controller()); | 125 | final Controller c = Get.put(Controller()); |
126 | 126 | ||
127 | return Scaffold( | 127 | return Scaffold( |
128 | - // Use Obx(()=> to update Text() whenever count is changed. | ||
129 | - appBar: AppBar(title: Obx(() => Text("Clicks: ${c.count}"))), | 128 | + // Используйте Obx(()=> чтобы обновить Text() как только count изменится. |
129 | + appBar: AppBar(title: Obx(() => Text("Кликов: ${c.count}"))), | ||
130 | 130 | ||
131 | - // Replace the 8 lines Navigator.push by a simple Get.to(). You don't need context | 131 | + // Замените 8 строк Navigator.push простым Get.to(). Вам не нужен context! |
132 | body: Center(child: RaisedButton( | 132 | body: Center(child: RaisedButton( |
133 | - child: Text("Go to Other"), onPressed: () => Get.to(Other()))), | 133 | + child: Text("Перейти к Other"), onPressed: () => Get.to(Other()))), |
134 | floatingActionButton: | 134 | floatingActionButton: |
135 | FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); | 135 | FloatingActionButton(child: Icon(Icons.add), onPressed: c.increment)); |
136 | } | 136 | } |
137 | } | 137 | } |
138 | 138 | ||
139 | class Other extends StatelessWidget { | 139 | class Other extends StatelessWidget { |
140 | - // You can ask Get to find a Controller that is being used by another page and redirect you to it. | 140 | + // "Попросите" Get найти и предоставить вам ваш Controller, используемый на другой странице. |
141 | final Controller c = Get.find(); | 141 | final Controller c = Get.find(); |
142 | 142 | ||
143 | @override | 143 | @override |
144 | Widget build(context){ | 144 | Widget build(context){ |
145 | - // Access the updated count variable | 145 | + // Получите доступ к обновленной переменной count |
146 | return Scaffold(body: Center(child: Text("${c.count}"))); | 146 | return Scaffold(body: Center(child: Text("${c.count}"))); |
147 | } | 147 | } |
148 | } | 148 | } |
@@ -186,13 +186,13 @@ Get имеет два разных менеджера состояний: про | @@ -186,13 +186,13 @@ Get имеет два разных менеджера состояний: про | ||
186 | Это ваша переменная: | 186 | Это ваша переменная: |
187 | 187 | ||
188 | ```dart | 188 | ```dart |
189 | -var name = 'Jonatas Borges'; | 189 | +var name = 'Джонатас Борхес'; |
190 | ``` | 190 | ``` |
191 | 191 | ||
192 | Чтобы сделать его наблюдаемым, вам просто нужно добавить в конец ".obs": | 192 | Чтобы сделать его наблюдаемым, вам просто нужно добавить в конец ".obs": |
193 | 193 | ||
194 | ```dart | 194 | ```dart |
195 | -var name = 'Jonatas Borges'.obs; | 195 | +var name = 'Джонатас Борхес'.obs; |
196 | ``` | 196 | ``` |
197 | 197 | ||
198 | А в пользовательском интерфейсе, если вы хотите отображать это значение и обновлять экран при изменении значений, просто сделайте следующее: | 198 | А в пользовательском интерфейсе, если вы хотите отображать это значение и обновлять экран при изменении значений, просто сделайте следующее: |
@@ -216,7 +216,7 @@ Obx(() => Text("${controller.name}")); | @@ -216,7 +216,7 @@ Obx(() => Text("${controller.name}")); | ||
216 | Добавьте "Get" перед MaterialApp, превратив его в GetMaterialApp. | 216 | Добавьте "Get" перед MaterialApp, превратив его в GetMaterialApp. |
217 | 217 | ||
218 | ```dart | 218 | ```dart |
219 | -GetMaterialApp( // Before: MaterialApp( | 219 | +GetMaterialApp( // Ранее: MaterialApp( |
220 | home: MyHome(), | 220 | home: MyHome(), |
221 | ) | 221 | ) |
222 | ``` | 222 | ``` |
@@ -264,7 +264,7 @@ Get.offAll(NextScreen()); | @@ -264,7 +264,7 @@ Get.offAll(NextScreen()); | ||
264 | Get имеет простой и мощный менеджер зависимостей, который позволяет вам получить тот же класс, что и ваш BLoC или контроллер, всего одной строкой кода, без Provider context, без InheritedWidget: | 264 | Get имеет простой и мощный менеджер зависимостей, который позволяет вам получить тот же класс, что и ваш BLoC или контроллер, всего одной строкой кода, без Provider context, без InheritedWidget: |
265 | 265 | ||
266 | ```dart | 266 | ```dart |
267 | -Controller controller = Get.put(Controller()); // Rather Controller controller = Controller(); | 267 | +Controller controller = Get.put(Controller()); // Вместо Controller controller = Controller(); |
268 | ``` | 268 | ``` |
269 | 269 | ||
270 | - Примечание: Если вы используете Get State Manager, обратите больше внимания на API привязок, который упростит подключение вашего представления к контроллеру. | 270 | - Примечание: Если вы используете Get State Manager, обратите больше внимания на API привязок, который упростит подключение вашего представления к контроллеру. |
@@ -281,7 +281,7 @@ controller.fetchApi(); | @@ -281,7 +281,7 @@ controller.fetchApi(); | ||
281 | 281 | ||
282 | ```dart | 282 | ```dart |
283 | Controller controller = Get.find(); | 283 | Controller controller = Get.find(); |
284 | -//Yes, it looks like Magic, Get will find your controller, and will deliver it to you. You can have 1 million controllers instantiated, Get will always give you the right controller. | 284 | +// Да, это выглядит как Магия! Get найдет ваш controller и доставит его вам. У вас может быть миллион созданных контроллеров, и Get всегда найдет нужный. |
285 | ``` | 285 | ``` |
286 | 286 | ||
287 | И тогда вы сможете восстановить данные вашего контроллера, которые были там получены: | 287 | И тогда вы сможете восстановить данные вашего контроллера, которые были там получены: |
@@ -332,9 +332,9 @@ Text('title'.tr); | @@ -332,9 +332,9 @@ Text('title'.tr); | ||
332 | 332 | ||
333 | ```dart | 333 | ```dart |
334 | return GetMaterialApp( | 334 | return GetMaterialApp( |
335 | - translations: Messages(), // your translations | ||
336 | - locale: Locale('en', 'US'), // translations will be displayed in that locale | ||
337 | - fallbackLocale: Locale('en', 'UK'), // specify the fallback locale in case an invalid locale is selected. | 335 | + translations: Messages(), // ваши переводы |
336 | + locale: Locale('en', 'US'), // перевод будет осуществлен в этой локализации | ||
337 | + fallbackLocale: Locale('en', 'UK'), // установите резервную локализацию на случай если будет выбрана невалидный локализация. | ||
338 | ); | 338 | ); |
339 | ``` | 339 | ``` |
340 | 340 | ||
@@ -385,43 +385,43 @@ Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); | @@ -385,43 +385,43 @@ Get.changeTheme(Get.isDarkMode? ThemeData.light(): ThemeData.dark()); | ||
385 | ## Другие API | 385 | ## Другие API |
386 | 386 | ||
387 | ```dart | 387 | ```dart |
388 | -// give the current args from currentScreen | 388 | +// получить текущие аргументы текущего экрана |
389 | Get.arguments | 389 | Get.arguments |
390 | 390 | ||
391 | -// give arguments of previous route | 391 | +// получить аргументы предыдущего маршрута |
392 | Get.previousArguments | 392 | Get.previousArguments |
393 | 393 | ||
394 | -// give name of previous route | 394 | +// получить имя предыдущего маршрута |
395 | Get.previousRoute | 395 | Get.previousRoute |
396 | 396 | ||
397 | -// give the raw route to access for example, rawRoute.isFirst() | 397 | +// получить чистый маршрут, например, чтобы узнать: rawRoute.isFirst() |
398 | Get.rawRoute | 398 | Get.rawRoute |
399 | 399 | ||
400 | -// give access to Rounting API from GetObserver | 400 | +// получить доступ к Rounting API из GetObserver |
401 | Get.routing | 401 | Get.routing |
402 | 402 | ||
403 | -// check if snackbar is open | 403 | +// проверить, открыт ли снэкбар |
404 | Get.isSnackbarOpen | 404 | Get.isSnackbarOpen |
405 | 405 | ||
406 | -// check if dialog is open | 406 | +// открыт ли диалог |
407 | Get.isDialogOpen | 407 | Get.isDialogOpen |
408 | 408 | ||
409 | -// check if bottomsheet is open | 409 | +// открыт ли bottomsheets |
410 | Get.isBottomSheetOpen | 410 | Get.isBottomSheetOpen |
411 | 411 | ||
412 | -// remove one route. | 412 | +// удалить один маршрут |
413 | Get.removeRoute() | 413 | Get.removeRoute() |
414 | 414 | ||
415 | -// back repeatedly until the predicate returns true. | 415 | +// возвращаться назад, пока данный предикат не выполнится |
416 | Get.until() | 416 | Get.until() |
417 | 417 | ||
418 | -// go to next route and remove all the previous routes until the predicate returns true. | 418 | +// идти вперед, удалив предыдущие маршруты, пока данный предикат не выполнится |
419 | Get.offUntil() | 419 | Get.offUntil() |
420 | 420 | ||
421 | -// go to next named route and remove all the previous routes until the predicate returns true. | 421 | +// перейти к следующему именованному маршруту, удалив предыдущие маршруты, пока данный предикат не выполнится |
422 | Get.offNamedUntil() | 422 | Get.offNamedUntil() |
423 | 423 | ||
424 | -//Check in what platform the app is running | 424 | +// проверить на какой платформе работает приложение |
425 | GetPlatform.isAndroid | 425 | GetPlatform.isAndroid |
426 | GetPlatform.isIOS | 426 | GetPlatform.isIOS |
427 | GetPlatform.isMacOS | 427 | GetPlatform.isMacOS |
@@ -429,91 +429,92 @@ GetPlatform.isWindows | @@ -429,91 +429,92 @@ GetPlatform.isWindows | ||
429 | GetPlatform.isLinux | 429 | GetPlatform.isLinux |
430 | GetPlatform.isFuchsia | 430 | GetPlatform.isFuchsia |
431 | 431 | ||
432 | -//Check the device type | 432 | +// проверить тип устройства |
433 | GetPlatform.isMobile | 433 | GetPlatform.isMobile |
434 | GetPlatform.isDesktop | 434 | GetPlatform.isDesktop |
435 | -//All platforms are supported independently in web! | ||
436 | -//You can tell if you are running inside a browser | ||
437 | -//on Windows, iOS, OSX, Android, etc. | 435 | +// В вебе все платформы поддерживаются независимо! |
436 | +// Можно узнать, работает ли приложение сейчас в браузере | ||
437 | +// и на Windows, и на iOS, и на OSX, и на Android и так далее | ||
438 | GetPlatform.isWeb | 438 | GetPlatform.isWeb |
439 | 439 | ||
440 | 440 | ||
441 | -// Equivalent to : MediaQuery.of(context).size.height, | ||
442 | -// but immutable. | 441 | +// Эквивалент : MediaQuery.of(context).size.height, |
442 | +// но неизменяемый. | ||
443 | Get.height | 443 | Get.height |
444 | Get.width | 444 | Get.width |
445 | 445 | ||
446 | -// Gives the current context of the Navigator. | 446 | +// Текущий котекст навигации |
447 | Get.context | 447 | Get.context |
448 | 448 | ||
449 | -// Gives the context of the snackbar/dialog/bottomsheet in the foreground, anywhere in your code. | 449 | +// Получить контекст показанного снэкбара/диалога/bottomsheets в любом месте вызова. |
450 | Get.contextOverlay | 450 | Get.contextOverlay |
451 | 451 | ||
452 | -// Note: the following methods are extensions on context. Since you | ||
453 | -// have access to context in any place of your UI, you can use it anywhere in the UI code | 452 | +// Внимание: методы ниже являются расширениями класса BuildContext. |
453 | +// Поскольку доступ к контексту есть в любом месте из вашего UI, | ||
454 | +// вы можете использовать расширения в любом месте UI кода | ||
454 | 455 | ||
455 | -// If you need a changeable height/width (like Desktop or browser windows that can be scaled) you will need to use context. | 456 | +// Если вам нужна изменяемая высота/ширина (например, настольное или браузерное окно, размер которого можно изменить), вам нужно использовать context |
456 | context.width | 457 | context.width |
457 | context.height | 458 | context.height |
458 | 459 | ||
459 | -// Gives you the power to define half the screen, a third of it and so on. | ||
460 | -// Useful for responsive applications. | 460 | +// Дает возможность определить половину экрана, треть и так далее. |
461 | +// Полезно для отзывчивых приложений. | ||
461 | // param dividedBy (double) optional - default: 1 | 462 | // param dividedBy (double) optional - default: 1 |
462 | // param reducedBy (double) optional - default: 0 | 463 | // param reducedBy (double) optional - default: 0 |
463 | context.heightTransformer() | 464 | context.heightTransformer() |
464 | context.widthTransformer() | 465 | context.widthTransformer() |
465 | 466 | ||
466 | -/// Similar to MediaQuery.of(context).size | 467 | +/// Схоже с MediaQuery.of(context).size |
467 | context.mediaQuerySize() | 468 | context.mediaQuerySize() |
468 | 469 | ||
469 | -/// Similar to MediaQuery.of(context).padding | 470 | +/// Схоже с MediaQuery.of(context).padding |
470 | context.mediaQueryPadding() | 471 | context.mediaQueryPadding() |
471 | 472 | ||
472 | -/// Similar to MediaQuery.of(context).viewPadding | 473 | +/// Схоже с MediaQuery.of(context).viewPadding |
473 | context.mediaQueryViewPadding() | 474 | context.mediaQueryViewPadding() |
474 | 475 | ||
475 | -/// Similar to MediaQuery.of(context).viewInsets; | 476 | +/// Схоже с MediaQuery.of(context).viewInsets; |
476 | context.mediaQueryViewInsets() | 477 | context.mediaQueryViewInsets() |
477 | 478 | ||
478 | -/// Similar to MediaQuery.of(context).orientation; | 479 | +/// Схоже с MediaQuery.of(context).orientation; |
479 | context.orientation() | 480 | context.orientation() |
480 | 481 | ||
481 | -/// Check if device is on landscape mode | 482 | +/// Проверить, в горизонтальном ли режиме устройство |
482 | context.isLandscape() | 483 | context.isLandscape() |
483 | 484 | ||
484 | -/// Check if device is on portrait mode | 485 | +/// Проверить, в вертикальном ли режиме устройство |
485 | context.isPortrait() | 486 | context.isPortrait() |
486 | 487 | ||
487 | -/// Similar to MediaQuery.of(context).devicePixelRatio; | 488 | +/// Схоже с to MediaQuery.of(context).devicePixelRatio; |
488 | context.devicePixelRatio() | 489 | context.devicePixelRatio() |
489 | 490 | ||
490 | -/// Similar to MediaQuery.of(context).textScaleFactor; | 491 | +/// Схоже с MediaQuery.of(context).textScaleFactor; |
491 | context.textScaleFactor() | 492 | context.textScaleFactor() |
492 | 493 | ||
493 | -/// Get the shortestSide from screen | 494 | +/// Получить shortestSide экрана |
494 | context.mediaQueryShortestSide() | 495 | context.mediaQueryShortestSide() |
495 | 496 | ||
496 | -/// True if width be larger than 800 | 497 | +/// Вернет True, если ширина больше 800 |
497 | context.showNavbar() | 498 | context.showNavbar() |
498 | 499 | ||
499 | -/// True if the shortestSide is smaller than 600p | 500 | +/// Вернет True, если меньшая сторона меньше 600p |
500 | context.isPhone() | 501 | context.isPhone() |
501 | 502 | ||
502 | -/// True if the shortestSide is largest than 600p | 503 | +/// Вернет True, если меньшая сторона больше 600p |
503 | context.isSmallTablet() | 504 | context.isSmallTablet() |
504 | 505 | ||
505 | -/// True if the shortestSide is largest than 720p | 506 | +/// Вернет True, если меньшая сторона больше 720p |
506 | context.isLargeTablet() | 507 | context.isLargeTablet() |
507 | 508 | ||
508 | -/// True if the current device is Tablet | 509 | +/// Вернет True, если текущее устройство — Планшет |
509 | context.isTablet() | 510 | context.isTablet() |
510 | 511 | ||
511 | -/// Returns a value<T> according to the screen size | ||
512 | -/// can give value for: | ||
513 | -/// watch: if the shortestSide is smaller than 300 | ||
514 | -/// mobile: if the shortestSide is smaller than 600 | ||
515 | -/// tablet: if the shortestSide is smaller than 1200 | ||
516 | -/// desktop: if width is largest than 1200 | 512 | +/// Возвращает value<T> в зависимости от размера экрана |
513 | +/// Можно устанавливать значения для: | ||
514 | +/// watch: Если меньшая сторона меньше 300 | ||
515 | +/// mobile: Если меньшая сторона меньше 600 | ||
516 | +/// tablet: Если меньшая сторона меньше 1200 | ||
517 | +/// desktop: Если ширина больше 1200 | ||
517 | context.responsiveValue<T>() | 518 | context.responsiveValue<T>() |
518 | ``` | 519 | ``` |
519 | 520 | ||
@@ -569,9 +570,9 @@ GetMaterialApp( | @@ -569,9 +570,9 @@ GetMaterialApp( | ||
569 | ); | 570 | ); |
570 | 571 | ||
571 | void localLogWriter(String text, {bool isError = false}) { | 572 | void localLogWriter(String text, {bool isError = false}) { |
572 | - // pass the message to your favourite logging package here | ||
573 | - // please note that even if enableLog: false log messages will be pushed in this callback | ||
574 | - // you get check the flag if you want through GetConfig.isLogEnable | 573 | + // передайте сообщение вашей любимой log-библиотеке |
574 | + // но учитывайте, что даже если enableLog: false, сообщения все равно будут передаваться сюда | ||
575 | + // узнать значение этого флага можно с помощью GetConfig.isLogEnable | ||
575 | } | 576 | } |
576 | 577 | ||
577 | ``` | 578 | ``` |
@@ -591,11 +592,11 @@ ValueBuilder<bool>( | @@ -591,11 +592,11 @@ ValueBuilder<bool>( | ||
591 | initialValue: false, | 592 | initialValue: false, |
592 | builder: (value, updateFn) => Switch( | 593 | builder: (value, updateFn) => Switch( |
593 | value: value, | 594 | value: value, |
594 | - onChanged: updateFn, // same signature! you could use ( newValue ) => updateFn( newValue ) | 595 | + onChanged: updateFn, // такая же сигнатура! Вы можете использовать ( newValue ) => updateFn( newValue ) |
595 | ), | 596 | ), |
596 | - // if you need to call something outside the builder method. | ||
597 | - onUpdate: (value) => print("Value updated: $value"), | ||
598 | - onDispose: () => print("Widget unmounted"), | 597 | + // Если нужно вызвать что-то вне метода builder |
598 | + onUpdate: (value) => print("Значение обновлено: $value"), | ||
599 | + onDispose: () => print("Виджет удален"), | ||
599 | ), | 600 | ), |
600 | ``` | 601 | ``` |
601 | 602 | ||
@@ -607,7 +608,7 @@ ValueBuilder<bool>( | @@ -607,7 +608,7 @@ ValueBuilder<bool>( | ||
607 | ```dart | 608 | ```dart |
608 | ObxValue((data) => Switch( | 609 | ObxValue((data) => Switch( |
609 | value: data.value, | 610 | value: data.value, |
610 | - onChanged: data, // Rx has a _callable_ function! You could use (flag) => data.value = flag, | 611 | + onChanged: data, // У Rx есть _callable_ функция! Вы можете использовать (flag) => data.value = flag, |
611 | ), | 612 | ), |
612 | false.obs, | 613 | false.obs, |
613 | ), | 614 | ), |
@@ -622,8 +623,8 @@ ObxValue((data) => Switch( | @@ -622,8 +623,8 @@ ObxValue((data) => Switch( | ||
622 | > код выглядит чище, но: | 623 | > код выглядит чище, но: |
623 | 624 | ||
624 | ```dart | 625 | ```dart |
625 | -var message = 'Hello world'.obs; | ||
626 | -print( 'Message "$message" has Type ${message.runtimeType}'); | 626 | +var message = 'Привет, мир'.obs; |
627 | +print( 'Тип "$message" — ${message.runtimeType}'); | ||
627 | ``` | 628 | ``` |
628 | 629 | ||
629 | Даже если `message` _выводит_ значение String, его тип - **RxString**! | 630 | Даже если `message` _выводит_ значение String, его тип - **RxString**! |
@@ -634,63 +635,63 @@ print( 'Message "$message" has Type ${message.runtimeType}'); | @@ -634,63 +635,63 @@ print( 'Message "$message" has Type ${message.runtimeType}'); | ||
634 | 635 | ||
635 | ```dart | 636 | ```dart |
636 | final name = 'GetX'.obs; | 637 | final name = 'GetX'.obs; |
637 | -// only "updates" the stream, if the value is different from the current one. | ||
638 | -name.value = 'Hey'; | 638 | +// "обновляет" поток только если значение отличается от текущего. |
639 | +name.value = 'Хей'; | ||
639 | 640 | ||
640 | -// All Rx properties are "callable" and returns the new value. | ||
641 | -// but this approach does not accepts `null`, the UI will not rebuild. | ||
642 | -name('Hello'); | 641 | +// Все свойства Rx являются "вызываемыми" и возвращают новые значения. |
642 | +// но это не работает с `null`: UI не будет перестроен. | ||
643 | +name('Привет'); | ||
643 | 644 | ||
644 | -// is like a getter, prints 'Hello'. | 645 | +// как геттер, напечатает 'Привет'. |
645 | name() ; | 646 | name() ; |
646 | 647 | ||
647 | -/// numbers: | 648 | +/// числа: |
648 | 649 | ||
649 | final count = 0.obs; | 650 | final count = 0.obs; |
650 | 651 | ||
651 | -// You can use all non mutable operations from num primitives! | 652 | +// Вы можете использовать все неизменяемые операции с числами! |
652 | count + 1; | 653 | count + 1; |
653 | 654 | ||
654 | -// Watch out! this is only valid if `count` is not final, but var | 655 | +// Осторожно! Это можно использовать только если `count` не final, а var |
655 | count += 1; | 656 | count += 1; |
656 | 657 | ||
657 | -// You can also compare against values: | 658 | +// Сравнения так же работают: |
658 | count > 2; | 659 | count > 2; |
659 | 660 | ||
660 | -/// booleans: | 661 | +/// логические: |
661 | 662 | ||
662 | final flag = false.obs; | 663 | final flag = false.obs; |
663 | 664 | ||
664 | -// switches the value between true/false | 665 | +// переключает значение между true/false |
665 | flag.toggle(); | 666 | flag.toggle(); |
666 | 667 | ||
667 | 668 | ||
668 | -/// all types: | 669 | +/// все типы: |
669 | 670 | ||
670 | -// Sets the `value` to null. | 671 | +// обнуляет значение переменной `value`. |
671 | flag.nil(); | 672 | flag.nil(); |
672 | 673 | ||
673 | -// All toString(), toJson() operations are passed down to the `value` | ||
674 | -print( count ); // calls `toString()` inside for RxInt | 674 | +// Все toString(), toJson() операции применяются к `value` |
675 | +print( count ); // вызывает `toString()` внутри RxInt | ||
675 | 676 | ||
676 | final abc = [0,1,2].obs; | 677 | final abc = [0,1,2].obs; |
677 | -// Converts the value to a json Array, prints RxList | ||
678 | -// Json is supported by all Rx types! | ||
679 | -print('json: ${jsonEncode(abc)}, type: ${abc.runtimeType}'); | 678 | +// Преобразует значение в json массив, выводит RxList |
679 | +// Json поддерживается всеми Rx типами! | ||
680 | +print('json: ${jsonEncode(abc)}, тип: ${abc.runtimeType}'); | ||
680 | 681 | ||
681 | -// RxMap, RxList and RxSet are special Rx types, that extends their native types. | ||
682 | -// but you can work with a List as a regular list, although is reactive! | ||
683 | -abc.add(12); // pushes 12 to the list, and UPDATES the stream. | ||
684 | -abc[3]; // like Lists, reads the index 3. | 682 | +// RxMap, RxList и RxSet являются особенными Rx типами: они расширяют нативные типы. |
683 | +// Но вы можете работать со списком как и с обычным списком, хоть и реактивным! | ||
684 | +abc.add(12); // добавлеет 12 в список, and ОБНОВЛЯЕТ поток. | ||
685 | +abc[3]; // как списки, возвращает значение с индексом 3. | ||
685 | 686 | ||
686 | 687 | ||
687 | -// equality works with the Rx and the value, but hashCode is always taken from the value | 688 | +// Сравнение равенства работает с Rx и с его value, но хэш код всегда берется у value |
688 | final number = 12.obs; | 689 | final number = 12.obs; |
689 | -print( number == 12 ); // prints > true | 690 | +print( number == 12 ); // печатает true |
690 | 691 | ||
691 | -/// Custom Rx Models: | 692 | +/// Кастомные Rx Модели: |
692 | 693 | ||
693 | -// toJson(), toString() are deferred to the child, so you can implement override on them, and print() the observable directly. | 694 | +// toJson(), toString() передаются child, так что вы можете перегрузить эти методы в нем, и вызвать print напрямую. |
694 | 695 | ||
695 | class User { | 696 | class User { |
696 | String name, last; | 697 | String name, last; |
@@ -698,22 +699,22 @@ class User { | @@ -698,22 +699,22 @@ class User { | ||
698 | User({this.name, this.last, this.age}); | 699 | User({this.name, this.last, this.age}); |
699 | 700 | ||
700 | @override | 701 | @override |
701 | - String toString() => '$name $last, $age years old'; | 702 | + String toString() => '$name $last, возраст: $age'; |
702 | } | 703 | } |
703 | 704 | ||
704 | -final user = User(name: 'John', last: 'Doe', age: 33).obs; | 705 | +final user = User(name: 'Джон', last: 'Доу', age: 33).obs; |
705 | 706 | ||
706 | -// `user` is "reactive", but the properties inside ARE NOT! | ||
707 | -// So, if we change some variable inside of it... | ||
708 | -user.value.name = 'Roi'; | ||
709 | -// The widget will not rebuild!, | ||
710 | -// `Rx` don't have any clue when you change something inside user. | ||
711 | -// So, for custom classes, we need to manually "notify" the change. | 707 | +// `user` – "реактивный", но его свойства – НЕТ! |
708 | +// Так что если мы обновим что-либо внутри user... | ||
709 | +user.value.name = 'Рой'; | ||
710 | +// Виджет перестроен не будет! | ||
711 | +// `Rx` не знает, изменили ли вы что-то у user. | ||
712 | +// Так что для кастомных классов вам нужно явно "уведомлять" об изменении. | ||
712 | user.refresh(); | 713 | user.refresh(); |
713 | 714 | ||
714 | -// or we can use the `update()` method! | 715 | +// или мы можем использовать метод `update()`! |
715 | user.update((value){ | 716 | user.update((value){ |
716 | - value.name='Roi'; | 717 | + value.name='Рой'; |
717 | }); | 718 | }); |
718 | 719 | ||
719 | print( user ); | 720 | print( user ); |
@@ -723,20 +724,20 @@ print( user ); | @@ -723,20 +724,20 @@ print( user ); | ||
723 | 724 | ||
724 | Я люблю этот виджет, он такой простой, но такой полезный! | 725 | Я люблю этот виджет, он такой простой, но такой полезный! |
725 | 726 | ||
726 | -Это`const Stateless` виджет, который имеет геттер `controller` для зарегистрированного `Controller`, вот и всё. | 727 | +Это `const Stateless` виджет, который имеет геттер `controller` для зарегистрированного `Controller`, вот и всё. |
727 | 728 | ||
728 | ```dart | 729 | ```dart |
729 | class AwesomeController extends GetxController { | 730 | class AwesomeController extends GetxController { |
730 | - final String title = 'My Awesome View'; | 731 | + final String title = 'Моя Удивительная View'; |
731 | } | 732 | } |
732 | 733 | ||
733 | - // ALWAYS remember to pass the `Type` you used to register your controller! | 734 | + // ВСЕГДА передавайте `Тип` вашего контроллера! |
734 | class AwesomeView extends GetView<AwesomeController> { | 735 | class AwesomeView extends GetView<AwesomeController> { |
735 | @override | 736 | @override |
736 | Widget build(BuildContext context) { | 737 | Widget build(BuildContext context) { |
737 | return Container( | 738 | return Container( |
738 | padding: EdgeInsets.all(20), | 739 | padding: EdgeInsets.all(20), |
739 | - child: Text( controller.title ), // just call `controller.something` | 740 | + child: Text( controller.title ), // просто вызовите `controller.что-то` |
740 | ); | 741 | ); |
741 | } | 742 | } |
742 | } | 743 | } |
@@ -767,37 +768,38 @@ print( user ); | @@ -767,37 +768,38 @@ print( user ); | ||
767 | 768 | ||
768 | ```dart | 769 | ```dart |
769 | Future<void> main() async { | 770 | Future<void> main() async { |
770 | - await initServices(); /// AWAIT SERVICES INITIALIZATION. | 771 | + await initServices(); /// ПОДОЖДИТЕ ИНИЦИАЛИЗАЦИЮ СЕРВИСОВ. |
771 | runApp(SomeApp()); | 772 | runApp(SomeApp()); |
772 | } | 773 | } |
773 | 774 | ||
774 | -/// Is a smart move to make your Services intiialize before you run the Flutter app. | ||
775 | -/// as you can control the execution flow (maybe you need to load some Theme configuration, | ||
776 | -/// apiKey, language defined by the User... so load SettingService before running ApiService. | ||
777 | -/// so GetMaterialApp() doesnt have to rebuild, and takes the values directly. | 775 | +/// Умным решением будет проинициализировать сервисы перед вызовом runApp, |
776 | +/// поскольку вы можете контроллировать процесс инициализации | ||
777 | +/// (может, вам нужно загрузить конфигурацию Темы, ключи API, язык, определенный пользователем... | ||
778 | +/// Загружайте SettingService прежде чем запускать ApiService. | ||
779 | +/// Таким образом GetMaterialApp() принимает параметры напрямую, и ему не нужно будет перезагружаться | ||
778 | void initServices() async { | 780 | void initServices() async { |
779 | - print('starting services ...'); | ||
780 | - /// Here is where you put get_storage, hive, shared_pref initialization. | ||
781 | - /// or moor connection, or whatever that's async. | 781 | + print('запуск сервисов ...'); |
782 | + /// Здесь вы инициализируете get_storage, hive, shared_pref, | ||
783 | + /// или что-либо другое асинхронное. | ||
782 | await Get.putAsync(() => DbService().init()); | 784 | await Get.putAsync(() => DbService().init()); |
783 | await Get.putAsync(SettingsService()).init(); | 785 | await Get.putAsync(SettingsService()).init(); |
784 | - print('All services started...'); | 786 | + print('Все сервисы запущены...'); |
785 | } | 787 | } |
786 | 788 | ||
787 | class DbService extends GetxService { | 789 | class DbService extends GetxService { |
788 | Future<DbService> init() async { | 790 | Future<DbService> init() async { |
789 | - print('$runtimeType delays 2 sec'); | 791 | + print('$runtimeType задержка 2 секунды'); |
790 | await 2.delay(); | 792 | await 2.delay(); |
791 | - print('$runtimeType ready!'); | 793 | + print('$runtimeType готов!'); |
792 | return this; | 794 | return this; |
793 | } | 795 | } |
794 | } | 796 | } |
795 | 797 | ||
796 | class SettingsService extends GetxService { | 798 | class SettingsService extends GetxService { |
797 | void init() async { | 799 | void init() async { |
798 | - print('$runtimeType delays 1 sec'); | 800 | + print('$runtimeType задержка 1 секунду'); |
799 | await 1.delay(); | 801 | await 1.delay(); |
800 | - print('$runtimeType ready!'); | 802 | + print('$runtimeType готов!'); |
801 | } | 803 | } |
802 | } | 804 | } |
803 | 805 |
-
Please register or login to post a comment