Committed by
GitHub
Merge pull request #892 from eduardoflorence/add-getconnect-doc-ptbr
Improve-doc-pt-br
Showing
1 changed file
with
189 additions
and
19 deletions
1 |  | 1 |  |
2 | 2 | ||
3 | -*Idiomas: [Inglês](README.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português Brasileiro (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreana](README.ko-kr.md).* | 3 | +**Idiomas: [Inglês](README.md), [Urdu](README.ur-PK.md), [Chinês](README.zh-cn.md), Português Brasileiro (este arquivo), [Espanhol](README-es.md), [Russo](README.ru.md), [Polonês](README.pl.md), [Coreana](README.ko-kr.md).** |
4 | 4 | ||
5 | [](https://pub.dev/packages/get) | 5 | [](https://pub.dev/packages/get) |
6 | +[](https://pub.dev/packages/get/score) | ||
6 |  | 7 |  |
7 | [](https://pub.dev/packages/effective_dart) | 8 | [](https://pub.dev/packages/effective_dart) |
8 | [](https://discord.com/invite/9Hpt99N) | 9 | [](https://discord.com/invite/9Hpt99N) |
@@ -39,6 +40,17 @@ | @@ -39,6 +40,17 @@ | ||
39 | - [Alterar local](#alterar-local) | 40 | - [Alterar local](#alterar-local) |
40 | - [Localidade do sistema operacional](#localidade-do-sistema-operacional) | 41 | - [Localidade do sistema operacional](#localidade-do-sistema-operacional) |
41 | - [Mudar tema (changeTheme)](#mudar-tema-changetheme) | 42 | - [Mudar tema (changeTheme)](#mudar-tema-changetheme) |
43 | + - [GetConnect](#getconnect) | ||
44 | + - [Configuração Padrão](#configuração-padrão) | ||
45 | + - [Configuração Personalizada](#configuração-personalizada) | ||
46 | + - [GetPage Middleware](#getpage-middleware) | ||
47 | + - [Priority](#priority) | ||
48 | + - [Redirect](#redirect) | ||
49 | + - [onPageCalled](#onpagecalled) | ||
50 | + - [OnBindingsStart](#onbindingsstart) | ||
51 | + - [OnPageBuildStart](#onpagebuildstart) | ||
52 | + - [OnPageBuilt](#onpagebuilt) | ||
53 | + - [OnPageDispose](#onpagedispose) | ||
42 | - [Outras APIs avançadas](#outras-apis-avançadas) | 54 | - [Outras APIs avançadas](#outras-apis-avançadas) |
43 | - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais) | 55 | - [Configurações Globais opcionais e configurações manuais](#configurações-globais-opcionais-e-configurações-manuais) |
44 | - [Widgets de Estado Local](#widgets-de-estado-local) | 56 | - [Widgets de Estado Local](#widgets-de-estado-local) |
@@ -63,17 +75,27 @@ | @@ -63,17 +75,27 @@ | ||
63 | # Sobre Get | 75 | # Sobre Get |
64 | 76 | ||
65 | - Get é uma biblioteca poderosa e extraleve para Flutter. Ela combina um gerenciador de estado de alta performance, injeção de dependência inteligente e gerenciamento de rotas de uma forma rápida e prática. | 77 | - Get é uma biblioteca poderosa e extraleve para Flutter. Ela combina um gerenciador de estado de alta performance, injeção de dependência inteligente e gerenciamento de rotas de uma forma rápida e prática. |
66 | -- GetX™ possui 3 princípios básicos, o que significa que esta é a prioridade para todos os recursos da biblioteca | ||
67 | - - **PERFOMANCE**: GetX™ é focado em desempenho e consumo mínimo de recursos. Os benchmarks quase sempre não são importantes no mundo real, mas se você quiser, há um indicador de consumo aqui ([benchmarks](https://github.com/jonataslaw/benchmarks)), onde GetX™ se sai melhor do que outras abordagens de gerenciamento de estado, por exemplo. A diferença não é grande, mas mostra nossa preocupação em não desperdiçar seus recursos. | 78 | + |
79 | +- GetX™ possui 3 princípios básicos, o que significa que esta é a prioridade para todos os recursos da biblioteca: **PRODUTIVIDADE, PERFORMANCE AND ORGANIZAÇÃO.** | ||
80 | + | ||
81 | + - **PERFOMANCE**: GetX™ é focado em desempenho e consumo mínimo de recursos. GetX não usa Streams ou ChangeNotifier. | ||
82 | + | ||
68 | - **PRODUTIVIDADE**: GetX™ usa uma sintaxe fácil e agradável. Não importa o que você queira fazer, sempre há uma maneira mais fácil com GetX™. Isso economizará horas de desenvolvimento e extrairá o máximo de desempenho que seu aplicativo pode oferecer. | 83 | - **PRODUTIVIDADE**: GetX™ usa uma sintaxe fácil e agradável. Não importa o que você queira fazer, sempre há uma maneira mais fácil com GetX™. Isso economizará horas de desenvolvimento e extrairá o máximo de desempenho que seu aplicativo pode oferecer. |
69 | - - **ORGANIZAÇÃO**: GetX™ permite o desacoplamento total da View, lógica de apresentação, lógica de negócios, injeção de dependência e navegação. Você não precisa de contexto para navegar entre as rotas, portanto, você não depende da árvore do widget (visualização) para isso. Você não precisa de contexto para acessar seus Controllers / BLoCs por meio de um inheritedWidget, então você desacopla completamente sua lógica de apresentação e lógica de negócios de sua camada de visualização. Você não precisa injetar suas classes Controllers / Models / BLoCs em sua árvore de widgets através de multiproviders, pois GetX™ usa seu próprio recurso de injeção de dependência, desacoplando a DI de sua View completamente. Com GetX™ você sabe onde encontrar cada recurso de sua aplicação, tendo o código limpo por padrão. Isso além de facilitar a manutenção, torna o compartilhamento dos módulos, algo que até então em Flutter era impensável, algo totalmente possível. O BLoC foi um ponto de partida para organizar o código no Flutter, ele separa a lógica de negócios da visualização. GetX™ é uma evolução natural disso, separando não apenas a lógica de negócios, mas a lógica de apresentação. O bônus da injeção de dependências e rotas também são dissociadas e a camada de dados está fora de tudo. Você sabe onde está tudo e tudo isso de uma maneira mais fácil do que construir um hello world. GetX™ é a maneira mais fácil, prática e escalonável de construir aplicativos de alto desempenho com o Flutter SDK, com um grande ecossistema em torno dele que funciona perfeitamente em conjunto, sendo fácil para iniciantes e preciso para especialistas. É seguro, estável, atualizado e oferece uma grande variedade de APIs integradas que não estão presentes no Flutter SDK padrão. | ||
70 | -- GetX™ não é inchado. Possui uma infinidade de recursos que permitem que você comece a programar sem se preocupar com nada, mas cada um desses recursos está em contêineres separados e só são iniciados após o uso. Se você usar apenas o Gerenciamento de estado, apenas o Gerenciamento de estado será compilado. Se você usar apenas rotas, nada do gerenciamento de estado será compilado. Você pode compilar o repositório de benchmark e verá que usando apenas o gerenciamento de estado Get, o aplicativo compilado com Get tornou-se menor do que todos os outros aplicativos que têm apenas o gerenciamento de estado de outros pacotes, porque nada que não seja usado será compilado em seu código e cada solução GetX™ foi projetada para ser extra leve. O mérito aqui também vem do tree shaking do Flutter, que é incrível e consegue eliminar recursos não utilizados como nenhum outro framework faz. | ||
71 | -- Navegue por rotas sem `context`, abra `Dialog`s, `Snackbar`s ou `BottomSheet`s de qualquer lugar no código, gerencie estados e injete dependências de uma forma simples e prática. | ||
72 | -- GetX™ possui um enorme ecossistema, capaz de rodar com o mesmo código no Android, iOS, Web, Mac, Linux, Windows e em seu servidor. É possível reutilizar totalmente o código feito no front-end em seu back-end com **[Get Server](https://github.com/jonataslaw/get_server)**. | 84 | + Geralmente, o desenvolvedor deve se preocupar em remover os controladores da memória. Com GetX™, isso não é necessário porque, por padrão, os recursos são removidos da memória quando não são usados. Se quiser mantê-lo na memória, você deve declarar explicitamente "permanent: true" em sua dependência. Dessa forma, além de economizar tempo, você corre menos risco de ter dependências desnecessárias na memória. O carregamento da dependência também é lazy por padrão. |
85 | + | ||
86 | + - **ORGANIZAÇÃO**: GetX™ permite o desacoplamento total da View, lógica de apresentação, lógica de negócios, injeção de dependência e navegação. Você não precisa de contexto para navegar entre as rotas, portanto, você não depende da árvore do widget (visualização) para isso. Você não precisa de contexto para acessar seus Controllers/BLoCs por meio de um inheritedWidget, então você desacopla completamente sua lógica de apresentação e lógica de negócios de sua camada de visualização. Você não precisa injetar suas classes Controllers/Models/BLoCs em sua árvore de widgets através de multiproviders, pois GetX™ usa seu próprio recurso de injeção de dependência, desacoplando a DI de sua View completamente. | ||
87 | + Com GetX™ você sabe onde encontrar cada recurso de sua aplicação, tendo o código limpo por padrão. Isso além de facilitar a manutenção, torna o compartilhamento dos módulos, algo que até então em Flutter era impensável, em algo totalmente possível. | ||
88 | + O BLoC foi um ponto de partida para organizar o código no Flutter, ele separa a lógica de negócios da visualização. GetX™ é uma evolução natural disso, separando não apenas a lógica de negócios, mas a lógica de apresentação. O bônus da injeção de dependências e rotas também são dissociadas e a camada de dados está fora de tudo. Você sabe onde está tudo e tudo isso de uma maneira mais fácil do que construir um hello world. | ||
89 | + GetX™ é a maneira mais fácil, prática e escalonável de construir aplicativos de alto desempenho com o Flutter SDK, com um grande ecossistema em torno dele que funciona perfeitamente em conjunto, sendo fácil para iniciantes e preciso para especialistas. É seguro, estável, atualizado e oferece uma grande variedade de APIs integradas que não estão presentes no Flutter SDK padrão. | ||
90 | + | ||
91 | +- GetX™ não é inchado. Possui uma infinidade de recursos que permitem que você comece a programar sem se preocupar com nada, mas cada um desses recursos está em contêineres separados e só são iniciados após o uso. Se você usar apenas o Gerenciamento de estado, apenas o Gerenciamento de estado será compilado. Se você usar apenas rotas, nada do gerenciamento de estado será compilado. | ||
73 | 92 | ||
74 | -Além disso, todo o processo de desenvolvimento pode ser totalmente automatizado, tanto no servidor quanto no front-end com **[Get CLI](https://github.com/jonataslaw/get_cli)**. | 93 | +- GetX™ possui um enorme ecossistema, uma grande comunidade, um grande número de colaboradores e será mantido enquanto o Flutter existir. Getx também é capaz de rodar com o mesmo código no Android, iOS, Web, Mac, Linux, Windows e em seu servidor. |
94 | +**É possível reutilizar totalmente seu código feito no frontend em seu backend com [Get Server](https://github.com/jonataslaw/get_server)**. | ||
75 | 95 | ||
76 | -Além disso, para aumentar ainda mais sua produtividade, temos a **[extensão para VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets)** e a **[extensão para Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** | 96 | +**Além disso, todo o processo de desenvolvimento pode ser totalmente automatizado, tanto no servidor quanto no front-end com **[Get CLI](https://github.com/jonataslaw/get_cli)**. |
97 | + | ||
98 | +**Além disso, para aumentar ainda mais sua produtividade, temos a [extensão para VSCode](https://marketplace.visualstudio.com/items?itemName=get-snippets.get-snippets) e a [extensão para Android Studio/Intellij](https://plugins.jetbrains.com/plugin/14975-getx-snippets)** | ||
77 | 99 | ||
78 | # Instalando | 100 | # Instalando |
79 | 101 | ||
@@ -167,13 +189,7 @@ Melhore seus prazos, entregue tudo a tempo sem perder performance. Get não é p | @@ -167,13 +189,7 @@ Melhore seus prazos, entregue tudo a tempo sem perder performance. Get não é p | ||
167 | 189 | ||
168 | ## Gerenciamento de estado | 190 | ## Gerenciamento de estado |
169 | 191 | ||
170 | -Há atualmente vários gerenciadores de estados para o Flutter. Porém, a maioria deles envolve usar `ChangeNotifier` para atualizar os widgets e isso é uma abordagem muito ruim no quesito performance em aplicações de médio ou grande porte. Você pode checar na documentação oficial do Flutter que o [`ChangeNotifier` deveria ser usado com um ou no máximo dois listeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html), fazendo-o praticamente inutilizável em qualquer aplicação média ou grande. | ||
171 | - | ||
172 | -Get não é melhor ou pior que nenhum gerenciador de estado, mas você deveria analisar esses pontos tanto quanto os argumentos abaixo para escolher entre usar Get na sua forma pura, ou usando-o em conjunto com outro gerenciador de estado. | ||
173 | - | ||
174 | -Definitivamente, Get não é o inimigo de nenhum gerenciador, porque Get é um microframework, não apenas um gerenciador, e pode ser usado tanto sozinho quanto em conjunto com eles. | ||
175 | - | ||
176 | -Get tem dois gerenciadores de estado diferentes: o simple state manager (vamos chamá-lo de GetBuilder) e o reactive state manager (que tem o nome do pacote, GetX) | 192 | +GetX™ posuui dois gerenciadores de estado diferentes: o gerenciador de estado simples (vamos chamá-lo de GetBuilder) e o gerenciador de estado reativo (GetX/Obx) |
177 | 193 | ||
178 | ### Reactive state manager | 194 | ### Reactive state manager |
179 | 195 | ||
@@ -183,6 +199,7 @@ Programação reativa pode alienar muitas pessoas porque é dito que é complica | @@ -183,6 +199,7 @@ Programação reativa pode alienar muitas pessoas porque é dito que é complica | ||
183 | * Você não precisa criar um StreamBuilder para cada variável | 199 | * Você não precisa criar um StreamBuilder para cada variável |
184 | * Você não precisa criar uma classe para cada estado | 200 | * Você não precisa criar uma classe para cada estado |
185 | * Você não precisa criar um get para o valor inicial | 201 | * Você não precisa criar um get para o valor inicial |
202 | +* Você não precisará usar geradores de código | ||
186 | 203 | ||
187 | Programação reativa com o Get é tão fácil quanto usar setState. | 204 | Programação reativa com o Get é tão fácil quanto usar setState. |
188 | 205 | ||
@@ -369,12 +386,12 @@ Get.updateLocale(locale); | @@ -369,12 +386,12 @@ Get.updateLocale(locale); | ||
369 | ``` | 386 | ``` |
370 | 387 | ||
371 | #### Localidade do sistema operacional | 388 | #### Localidade do sistema operacional |
372 | -Para ler a localidade do sistema operacional, você pode usar `window.locale`. | 389 | +Para ler a localidade do sistema operacional, você pode usar `Get.deviceLocale`. |
373 | ```dart | 390 | ```dart |
374 | import 'dart:ui' as ui; | 391 | import 'dart:ui' as ui; |
375 | 392 | ||
376 | return GetMaterialApp( | 393 | return GetMaterialApp( |
377 | - locale: ui.window.locale, | 394 | + locale: Get.deviceLocale, |
378 | ); | 395 | ); |
379 | ``` | 396 | ``` |
380 | 397 | ||
@@ -402,6 +419,159 @@ Se você quiser saber mais como trocar o tema, você pode seguir esse tutorial n | @@ -402,6 +419,159 @@ Se você quiser saber mais como trocar o tema, você pode seguir esse tutorial n | ||
402 | 419 | ||
403 | - [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). | 420 | - [Dynamic Themes in 3 lines using Get](https://medium.com/swlh/flutter-dynamic-themes-in-3-lines-c3b375f292e3) - Tutorial by [Rod Brown](https://github.com/RodBr). |
404 | 421 | ||
422 | + | ||
423 | +## GetConnect | ||
424 | +GetConnect é uma maneira fácil de se comunicar de trás para a frente com http ou websockets | ||
425 | + | ||
426 | +### Configuração Padrão | ||
427 | +Você pode simplesmente estender GetConnect e usar os métodos GET/POST/PUT/DELETE/SOCKET para se comunicar com sua API Rest ou websockets. | ||
428 | + | ||
429 | +```dart | ||
430 | +class UserProvider extends GetConnect { | ||
431 | + // Requisição Get | ||
432 | + Future<Response> getUser(int id) => get('http://youapi/users/$id'); | ||
433 | + // Requisição Post | ||
434 | + Future<Response> postUser(Map data) => post('http://youapi/users', body: data); | ||
435 | + // Requisição Post com Arquivo | ||
436 | + Future<Response<CasesModel>> postCases(List<int> image) { | ||
437 | + final form = FormData({ | ||
438 | + 'file': MultipartFile(image, filename: 'avatar.png'), | ||
439 | + 'otherFile': MultipartFile(image, filename: 'cover.png'), | ||
440 | + }); | ||
441 | + return post('http://youapi/users/upload', form); | ||
442 | + } | ||
443 | + | ||
444 | + GetSocket userMessages() { | ||
445 | + return socket('https://yourapi/users/socket'); | ||
446 | + } | ||
447 | +} | ||
448 | +``` | ||
449 | +### Configuração Personalizada | ||
450 | +GetConnect é altamente personalizável, você pode definir uma base Url, modificadores de resposta, modificadores de Requests, definir um autenticador e até o número de tentativas em que tentará se autenticar, além de dar a possibilidade de definir um decodificador padrão que irá transformar todas as suas solicitações em seus modelos sem qualquer configuração adicional. | ||
451 | + | ||
452 | +```dart | ||
453 | +class HomeProvider extends GetConnect { | ||
454 | + @override | ||
455 | + void onInit() { | ||
456 | + // Todas as requisições passam por jsonEncode e então por CasesModel.fromJson() | ||
457 | + httpClient.defaultDecoder = CasesModel.fromJson; | ||
458 | + httpClient.baseUrl = 'https://api.covid19api.com'; | ||
459 | + // baseUrl = 'https://api.covid19api.com'; // Define baseUrl para | ||
460 | + // Http e websockets se usado sem uma instância [httpClient] | ||
461 | + | ||
462 | + // Anexa a propriedade 'apikey' no cabeçalho de todas as requisições | ||
463 | + httpClient.addRequestModifier((request) { | ||
464 | + request.headers['apikey'] = '12345678'; | ||
465 | + return request; | ||
466 | + }); | ||
467 | + | ||
468 | + // Mesmo que o servidor envie dados do país "Brasil", | ||
469 | + // eles nunca serão exibidos para os usuários, porque você removeu | ||
470 | + // os dados da resposta, mesmo antes de a resposta ser entregue | ||
471 | + httpClient.addResponseModifier<CasesModel>((request, response) { | ||
472 | + CasesModel model = response.body; | ||
473 | + if (model.countries.contains('Brazil')) { | ||
474 | + model.countries.remove('Brazil'); | ||
475 | + } | ||
476 | + }); | ||
477 | + | ||
478 | + httpClient.addAuthenticator((request) async { | ||
479 | + final response = await get("http://yourapi/token"); | ||
480 | + final token = response.body['token']; | ||
481 | + // Configurando um cabeçalho | ||
482 | + request.headers['Authorization'] = "$token"; | ||
483 | + return request; | ||
484 | + }); | ||
485 | + | ||
486 | + // O autenticador será chamado 3 vezes se HttpStatus for | ||
487 | + // HttpStatus.unauthorized | ||
488 | + httpClient.maxAuthRetries = 3; | ||
489 | + } | ||
490 | + } | ||
491 | + | ||
492 | + @override | ||
493 | + Future<Response<CasesModel>> getCases(String path) => get(path); | ||
494 | +} | ||
495 | +``` | ||
496 | + | ||
497 | +## GetPage Middleware | ||
498 | + | ||
499 | +O GetPage agora tem uma nova propriedade que recebe uma lista de GetMiddleWare e executa cada item na ordem específica. | ||
500 | + | ||
501 | +**Nota**: Quando GetPage tem Middlewares, todos os filhos desta página terão os mesmos middlewares automaticamente. | ||
502 | + | ||
503 | +### Priority | ||
504 | + | ||
505 | +A ordem dos middlewares a serem executados pode ser definida pela prioridade no GetMiddleware. | ||
506 | + | ||
507 | +```dart | ||
508 | +final middlewares = [ | ||
509 | + GetMiddleware(priority: 2), | ||
510 | + GetMiddleware(priority: 5), | ||
511 | + GetMiddleware(priority: 4), | ||
512 | + GetMiddleware(priority: -8), | ||
513 | +]; | ||
514 | +``` | ||
515 | +Esses middlewares serão executados nesta ordem: **-8 => 2 => 4 => 5** | ||
516 | + | ||
517 | +### Redirect | ||
518 | + | ||
519 | +Esta função será chamada quando a página da rota chamada estiver sendo pesquisada. RouteSettings se torna o resultado do redirecionamento. Ou retorne nulo e não haverá redirecionamento. | ||
520 | + | ||
521 | +```dart | ||
522 | +GetPage redirect( ) { | ||
523 | + final authService = Get.find<AuthService>(); | ||
524 | + return authService.authed.value ? null : RouteSettings(name: '/login') | ||
525 | +} | ||
526 | +``` | ||
527 | + | ||
528 | +### onPageCalled | ||
529 | + | ||
530 | +Esta função será chamada quando uma página for chamada, antes de qualquer coisa ser criada e | ||
531 | +você pode usá-la para mudar algo sobre a página ou dar-lhe uma nova página | ||
532 | + | ||
533 | +```dart | ||
534 | +GetPage onPageCalled(GetPage page) { | ||
535 | + final authService = Get.find<AuthService>(); | ||
536 | + return page.copyWith(title: 'Welcome ${authService.UserName}'); | ||
537 | +} | ||
538 | +``` | ||
539 | + | ||
540 | +### OnBindingsStart | ||
541 | + | ||
542 | +Esta função será chamada logo antes da inicialização dos Bindings. | ||
543 | +Aqui você pode alterar as ligações desta página. | ||
544 | + | ||
545 | +```dart | ||
546 | +List<Bindings> onBindingsStart(List<Bindings> bindings) { | ||
547 | + final authService = Get.find<AuthService>(); | ||
548 | + if (authService.isAdmin) { | ||
549 | + bindings.add(AdminBinding()); | ||
550 | + } | ||
551 | + return bindings; | ||
552 | +} | ||
553 | +``` | ||
554 | + | ||
555 | +### OnPageBuildStart | ||
556 | + | ||
557 | +Esta função será chamada logo após a inicialização dos Bindings. | ||
558 | +Aqui você pode fazer algo depois de criar as ligações e antes de criar o widget da página. | ||
559 | + | ||
560 | +```dart | ||
561 | +GetPageBuilder onPageBuildStart(GetPageBuilder page) { | ||
562 | + print('bindings are ready'); | ||
563 | + return page; | ||
564 | +} | ||
565 | +``` | ||
566 | + | ||
567 | +### OnPageBuilt | ||
568 | + | ||
569 | +Esta função será chamada logo após a função GetPage.page ser chamada e fornecerá o resultado da função e obtém o widget que será mostrado. | ||
570 | + | ||
571 | +### OnPageDispose | ||
572 | + | ||
573 | +Esta função será chamada logo após descartar todos os objetos relacionados (controladores, visualizações, ...) da página. | ||
574 | + | ||
405 | ## Outras APIs avançadas | 575 | ## Outras APIs avançadas |
406 | 576 | ||
407 | ```dart | 577 | ```dart |
@@ -757,7 +927,7 @@ class AwesomeView extends GetView<AwesomeController> { | @@ -757,7 +927,7 @@ class AwesomeView extends GetView<AwesomeController> { | ||
757 | Widget build(BuildContext context) { | 927 | Widget build(BuildContext context) { |
758 | return Container( | 928 | return Container( |
759 | padding: EdgeInsets.all(20), | 929 | padding: EdgeInsets.all(20), |
760 | - child: Text( controller.title ), // apenas chame `controller.something` | 930 | + child: Text(controller.title ), // apenas chame `controller.something` |
761 | ); | 931 | ); |
762 | } | 932 | } |
763 | } | 933 | } |
-
Please register or login to post a comment