Nikita Sirovsky
Committed by GitHub

Update README.ru.md

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