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