Full Code of JHBitencourt/dart-book for AI

master 3dcb4049d330 cached
487 files
753.8 KB
278.1k tokens
1610 symbols
1 requests
Download .txt
Showing preview only (893K chars total). Download the full file or copy to clipboard to get everything.
Repository: JHBitencourt/dart-book
Branch: master
Commit: 3dcb4049d330
Files: 487
Total size: 753.8 KB

Directory structure:
gitextract__k1_49lz/

├── .github/
│   └── workflows/
│       └── deploy.yaml
├── .gitignore
├── CNAME
├── README.md
├── code/
│   └── pt_Br/
│       ├── 01_capitulo/
│       │   ├── 01_primeiro_programa/
│       │   │   └── main.dart
│       │   └── 02_erro_main/
│       │       └── main.dart
│       ├── 02_capitulo/
│       │   ├── 01_operadores_aritmeticos/
│       │   │   └── main.dart
│       │   ├── 02_operadores_relacionais_equalidade/
│       │   │   └── main.dart
│       │   ├── 03_operadores_logicos/
│       │   │   └── main.dart
│       │   ├── 04_operador_bit_and/
│       │   │   └── main.dart
│       │   ├── 05_operador_bit_or/
│       │   │   └── main.dart
│       │   ├── 06_operador_bit_xor/
│       │   │   └── main.dart
│       │   ├── 07_operador_bit_not/
│       │   │   └── main.dart
│       │   ├── 08_operador_bit_shift_direita/
│       │   │   └── main.dart
│       │   ├── 09_operador_bit_shift_esquerda/
│       │   │   └── main.dart
│       │   ├── 10_operador_bit_shift_direita_unsigned/
│       │   │   └── main.dart
│       │   ├── 11_operador_atribuicao/
│       │   │   └── main.dart
│       │   ├── 12_operador_incremento_decremento_1/
│       │   │   └── main.dart
│       │   ├── 13_operador_incremento_decremento_2/
│       │   │   └── main.dart
│       │   ├── 14_operador_validacao_tipo_1/
│       │   │   └── main.dart
│       │   ├── 15_operador_validacao_tipo_2/
│       │   │   └── main.dart
│       │   ├── 16_operador_cascade/
│       │   │   └── main.dart
│       │   ├── 17_operador_spread/
│       │   │   └── main.dart
│       │   ├── 18_operador_ternario/
│       │   │   └── main.dart
│       │   ├── 19_operador_acesso/
│       │   │   └── main.dart
│       │   ├── 20_operador_ternario_nulo/
│       │   │   └── main.dart
│       │   ├── 21_operador_atribuicao_nulo/
│       │   │   └── main.dart
│       │   ├── 22_operador_acesso_nulo/
│       │   │   └── main.dart
│       │   ├── 23_operador_cascade_nulo/
│       │   │   └── main.dart
│       │   ├── 24_operador_acesso_itens_nulo/
│       │   │   └── main.dart
│       │   ├── 25_operador_bang/
│       │   │   └── main.dart
│       │   ├── 26_precedencia_operadores/
│       │   │   └── main.dart
│       │   ├── 27_if_else/
│       │   │   └── main.dart
│       │   ├── 28_switch_case/
│       │   │   └── main.dart
│       │   ├── 29_switch_case_patterns/
│       │   │   └── main.dart
│       │   ├── 30_switch_case_expressions/
│       │   │   └── main.dart
│       │   ├── 31_if_case/
│       │   │   └── main.dart
│       │   ├── 32_if_case_when/
│       │   │   └── main.dart
│       │   ├── 33_while/
│       │   │   └── main.dart
│       │   ├── 34_do_while/
│       │   │   └── main.dart
│       │   ├── 35_for/
│       │   │   └── main.dart
│       │   ├── 36_for_nomeado/
│       │   │   └── main.dart
│       │   ├── 37_for_in/
│       │   │   └── main.dart
│       │   └── 38_assert/
│       │       └── main.dart
│       ├── 03_capitulo/
│       │   ├── 01_coercao/
│       │   │   └── main.dart
│       │   ├── 02_dart_analyzer_1/
│       │   │   └── main.dart
│       │   ├── 03_dart_analyzer_2/
│       │   │   └── main.dart
│       │   ├── 04_inferencia_tipo/
│       │   │   └── main.dart
│       │   ├── 05_inferencia_tipo_parametros/
│       │   │   └── main.dart
│       │   ├── 06_dynamic/
│       │   │   └── main.dart
│       │   ├── 07_numeros/
│       │   │   └── main.dart
│       │   ├── 08_booleanos/
│       │   │   └── main.dart
│       │   ├── 09_symbols/
│       │   │   └── main.dart
│       │   ├── 10_null_safety/
│       │   │   └── main.dart
│       │   ├── 11_nullable_types/
│       │   │   └── main.dart
│       │   ├── 12_type_promotion/
│       │   │   └── main.dart
│       │   ├── 13_type_promotion_nullable/
│       │   │   └── main.dart
│       │   ├── 14_operador_bang/
│       │   │   └── main.dart
│       │   ├── 15_strings/
│       │   │   └── main.dart
│       │   ├── 16_surrogate_pairs/
│       │   │   └── main.dart
│       │   ├── 17_criacao_strings/
│       │   │   └── main.dart
│       │   ├── 18_interpolacao_strings/
│       │   │   └── main.dart
│       │   ├── 19_otimizacao_strings/
│       │   │   └── main.dart
│       │   ├── 20_strings_sob_demanda/
│       │   │   └── main.dart
│       │   ├── 21_strings_geral/
│       │   │   └── main.dart
│       │   ├── 22_variaveis_var/
│       │   │   └── main.dart
│       │   ├── 23_variaveis_static/
│       │   │   └── main.dart
│       │   ├── 24_variaveis_final_const/
│       │   │   └── main.dart
│       │   └── 25_variaveis_late/
│       │       └── main.dart
│       ├── 04_capitulo/
│       │   ├── 01_fatorial/
│       │   │   └── main.dart
│       │   ├── 02_escopo/
│       │   │   └── main.dart
│       │   ├── 03_tipo_function/
│       │   │   └── main.dart
│       │   ├── 04_retornos/
│       │   │   └── main.dart
│       │   ├── 05_never/
│       │   │   └── main.dart
│       │   ├── 06_escopo_closure/
│       │   │   └── main.dart
│       │   ├── 07_tear_off/
│       │   │   └── main.dart
│       │   ├── 08_parametro_posicional_obrigatorio/
│       │   │   └── main.dart
│       │   ├── 09_parametro_posicional_opcional/
│       │   │   └── main.dart
│       │   ├── 10_parametro_nomeado_opcional/
│       │   │   └── main.dart
│       │   ├── 11_parametro_nomeado_obrigatorio/
│       │   │   └── main.dart
│       │   ├── 12_enums/
│       │   │   └── main.dart
│       │   └── 13_typedef/
│       │       └── main.dart
│       ├── 05_capitulo/
│       │   ├── 01_errors/
│       │   │   └── main.dart
│       │   ├── 02_exceptions/
│       │   │   └── main.dart
│       │   ├── 03_throw/
│       │   │   └── main.dart
│       │   ├── 04_exception_customizada/
│       │   │   └── main.dart
│       │   ├── 05_assert/
│       │   │   └── main.dart
│       │   ├── 06_assert_x_error/
│       │   │   └── main.dart
│       │   ├── 07_try_catch/
│       │   │   └── main.dart
│       │   ├── 08_try_catch_on/
│       │   │   └── main.dart
│       │   ├── 09_try_catch_exception/
│       │   │   └── main.dart
│       │   └── 10_try_catch_finally/
│       │       └── main.dart
│       ├── 06_capitulo/
│       │   └── 01_codigo_ansi/
│       │       └── main.dart
│       ├── 07_capitulo/
│       │   ├── 01_analyzer/
│       │   │   └── main.dart
│       │   ├── 02_analyzer_linter/
│       │   │   ├── analysis_options.yaml
│       │   │   └── main.dart
│       │   └── 03_comments/
│       │       └── main.dart
│       ├── 08_capitulo/
│       │   ├── 01_objeto/
│       │   │   └── main.dart
│       │   ├── 02_to_string/
│       │   │   └── main.dart
│       │   ├── 03_equalidade/
│       │   │   └── main.dart
│       │   ├── 04_sobrescrita_operadores/
│       │   │   └── main.dart
│       │   ├── 05_construtor_padrao/
│       │   │   └── main.dart
│       │   ├── 06_construtor_nomeado/
│       │   │   └── main.dart
│       │   ├── 07_construtor_const/
│       │   │   └── main.dart
│       │   ├── 08_construtor_factory/
│       │   │   └── main.dart
│       │   ├── 09_encapsulamento/
│       │   │   └── main.dart
│       │   ├── 10_heranca/
│       │   │   └── main.dart
│       │   ├── 11_polimorfismo/
│       │   │   └── main.dart
│       │   ├── 12_classes_abstratas/
│       │   │   └── main.dart
│       │   ├── 13_interfaces/
│       │   │   └── main.dart
│       │   ├── 14_mixins/
│       │   │   └── main.dart
│       │   ├── 15_mixins_a_fundo/
│       │   │   └── main.dart
│       │   ├── 16_extension_methods/
│       │   │   └── main.dart
│       │   ├── 17_extension_methods_arquivo_diferente/
│       │   │   ├── main.dart
│       │   │   └── strings_extension.dart
│       │   ├── 18_classe_wrapper/
│       │   │   └── main.dart
│       │   ├── 19_extension_types/
│       │   │   ├── main.dart
│       │   │   └── pubspec.yaml
│       │   ├── 20_modifiers_abstract/
│       │   │   └── main.dart
│       │   ├── 21_modifiers_interface/
│       │   │   ├── arquivo.dart
│       │   │   └── main.dart
│       │   ├── 22_modifiers_base/
│       │   │   ├── arquivo.dart
│       │   │   └── main.dart
│       │   ├── 23_modifiers_final/
│       │   │   ├── arquivo.dart
│       │   │   └── main.dart
│       │   └── 24_modifiers_sealed/
│       │       └── main.dart
│       ├── 09_capitulo/
│       │   ├── 01_generics_1/
│       │   │   └── main.dart
│       │   ├── 02_generics_2/
│       │   │   └── main.dart
│       │   ├── 03_generics_3/
│       │   │   └── main.dart
│       │   ├── 04_generics_restringindo_tipo/
│       │   │   └── main.dart
│       │   ├── 05_generics_metodos/
│       │   │   └── main.dart
│       │   ├── 06_lists/
│       │   │   └── main.dart
│       │   ├── 07_iterando_lists/
│       │   │   └── main.dart
│       │   ├── 08_linked_hash_set/
│       │   │   └── main.dart
│       │   ├── 09_hash_set/
│       │   │   └── main.dart
│       │   ├── 10_splay_tree_set/
│       │   │   └── main.dart
│       │   ├── 11_queue/
│       │   │   └── main.dart
│       │   ├── 12_map/
│       │   │   └── main.dart
│       │   ├── 13_records/
│       │   │   └── main.dart
│       │   ├── 14_records_tipados/
│       │   │   └── main.dart
│       │   ├── 15_records_equalidade/
│       │   │   └── main.dart
│       │   ├── 16_records_retorno_funcao/
│       │   │   └── main.dart
│       │   ├── 17_pattern_matching/
│       │   │   └── main.dart
│       │   ├── 18_pattern_destructuring/
│       │   │   └── main.dart
│       │   ├── 19_pattern_for_looping/
│       │   │   └── main.dart
│       │   └── 20_pattern_collection_literal/
│       │       └── main.dart
│       ├── 10_capitulo/
│       │   ├── 01_event_loop/
│       │   │   └── main.dart
│       │   ├── 02_programa_sincrono_1/
│       │   │   └── main.dart
│       │   ├── 03_programa_sincrono_2/
│       │   │   └── main.dart
│       │   ├── 04_future/
│       │   │   └── main.dart
│       │   ├── 05_future_encadeado/
│       │   │   └── main.dart
│       │   ├── 06_erro_cadeia_assincrona/
│       │   │   └── main.dart
│       │   ├── 07_erro_cadeia_try_catch/
│       │   │   └── main.dart
│       │   ├── 08_erro_cadeia_catch_error/
│       │   │   └── main.dart
│       │   ├── 09_erro_cadeia_on_error/
│       │   │   └── main.dart
│       │   ├── 10_future_sync/
│       │   │   └── main.dart
│       │   ├── 11_future_microtask/
│       │   │   └── main.dart
│       │   ├── 12_future_value/
│       │   │   └── main.dart
│       │   ├── 13_future_error/
│       │   │   └── main.dart
│       │   ├── 14_future_wait/
│       │   │   └── main.dart
│       │   ├── 15_future_any/
│       │   │   └── main.dart
│       │   ├── 16_async_await/
│       │   │   └── main.dart
│       │   ├── 17_async_await_fluxo/
│       │   │   └── main.dart
│       │   ├── 18_async_await_x_future/
│       │   │   └── main.dart
│       │   ├── 19_async_await_erro/
│       │   │   └── main.dart
│       │   ├── 20_completer_future/
│       │   │   └── main.dart
│       │   └── 21_completer_flexibilidade/
│       │       └── main.dart
│       ├── 11_capitulo/
│       │   ├── 01_dart_args/
│       │   │   └── main.dart
│       │   ├── 02_dart_http/
│       │   │   ├── main.dart
│       │   │   └── pubspec.yaml
│       │   └── 03_dart_convert/
│       │       └── main.dart
│       ├── 12_capitulo/
│       │   ├── 01_stream_subscription/
│       │   │   └── main.dart
│       │   ├── 02_stream_subscription_varios_dados/
│       │   │   └── main.dart
│       │   ├── 03_stream_subscription_callbacks/
│       │   │   └── main.dart
│       │   ├── 04_inscricao_unica_listener/
│       │   │   └── main.dart
│       │   ├── 05_broadcast_listener/
│       │   │   └── main.dart
│       │   ├── 06_stream_controller/
│       │   │   └── main.dart
│       │   ├── 07_stream_controller_sink/
│       │   │   └── main.dart
│       │   ├── 08_stream_consumer/
│       │   │   └── main.dart
│       │   ├── 09_stream_consumer_2/
│       │   │   └── main.dart
│       │   ├── 10_stream_sink_close/
│       │   │   └── main.dart
│       │   ├── 11_stream_sink_x_stream_controller/
│       │   │   └── main.dart
│       │   ├── 12_controller_callback_inscricao_unica/
│       │   │   └── main.dart
│       │   ├── 13_controller_callback_broadcast/
│       │   │   └── main.dart
│       │   ├── 14_stream_await/
│       │   │   └── main.dart
│       │   ├── 15_stream_await_error/
│       │   │   └── main.dart
│       │   ├── 16_stream_await_sem_encerramento/
│       │   │   └── main.dart
│       │   ├── 17_stream_propriedades/
│       │   │   └── main.dart
│       │   ├── 18_stream_metodos_busca/
│       │   │   └── main.dart
│       │   ├── 19_stream_metodos_validacao/
│       │   │   └── main.dart
│       │   ├── 20_as_broadcast_stream/
│       │   │   └── main.dart
│       │   ├── 21_distinct/
│       │   │   └── main.dart
│       │   ├── 22_map/
│       │   │   └── main.dart
│       │   ├── 23_expand/
│       │   │   └── main.dart
│       │   ├── 24_async_map/
│       │   │   └── main.dart
│       │   ├── 25_async_expand/
│       │   │   └── main.dart
│       │   ├── 26_skip/
│       │   │   └── main.dart
│       │   ├── 27_skip_while/
│       │   │   └── main.dart
│       │   ├── 28_take/
│       │   │   └── main.dart
│       │   ├── 29_take_while/
│       │   │   └── main.dart
│       │   ├── 30_where/
│       │   │   └── main.dart
│       │   ├── 31_timeout/
│       │   │   └── main.dart
│       │   ├── 32_to_list_to_set/
│       │   │   └── main.dart
│       │   ├── 33_drain/
│       │   │   └── main.dart
│       │   ├── 34_for_each/
│       │   │   └── main.dart
│       │   ├── 35_fold/
│       │   │   └── main.dart
│       │   ├── 36_reduce/
│       │   │   └── main.dart
│       │   ├── 37_join/
│       │   │   └── main.dart
│       │   ├── 38_cast/
│       │   │   └── main.dart
│       │   ├── 39_handle_error/
│       │   │   └── main.dart
│       │   └── 40_pipe/
│       │       └── main.dart
│       ├── 13_capitulo/
│       │   ├── 01_interface_stream_transformer/
│       │   │   └── main.dart
│       │   ├── 02_construtor_stream_transformer/
│       │   │   └── main.dart
│       │   ├── 03_stream_transformer_base/
│       │   │   └── main.dart
│       │   ├── 04_stream_transformer_from_handlers/
│       │   │   └── main.dart
│       │   ├── 05_stream_transformer_from_bind/
│       │   │   └── main.dart
│       │   ├── 06_problema_inscricao_unica/
│       │   │   └── main.dart
│       │   ├── 07_sem_perda_eventos/
│       │   │   └── main.dart
│       │   ├── 08_perda_eventos_broadcast/
│       │   │   └── main.dart
│       │   ├── 09_broadcast_subscription_buffer/
│       │   │   └── main.dart
│       │   ├── 10_geradores_sincronos_yield/
│       │   │   └── main.dart
│       │   ├── 11_geradores_sincronos_yield_*/
│       │   │   └── main.dart
│       │   ├── 12_geradores_assincronos_yield/
│       │   │   └── main.dart
│       │   ├── 13_geradores_assincronos_yield_*/
│       │   │   └── main.dart
│       │   └── 14_server/
│       │       └── main.dart
│       ├── 14_capitulo/
│       │   ├── 01_isolate/
│       │   │   └── main.dart
│       │   ├── 02_nova_isolate/
│       │   │   └── main.dart
│       │   ├── 03_unidirecional_unica/
│       │   │   └── main.dart
│       │   ├── 04_unidirecional_frequente/
│       │   │   └── main.dart
│       │   ├── 05_bidirecional/
│       │   │   └── main.dart
│       │   ├── 06_controle_isolate/
│       │   │   └── main.dart
│       │   ├── 07_isolate_listeners/
│       │   │   └── main.dart
│       │   ├── 08_spawn_uri/
│       │   │   ├── isolate.dart
│       │   │   └── main.dart
│       │   ├── 09_isolate_run/
│       │   │   └── main.dart
│       │   ├── 10_zone_root/
│       │   │   └── main.dart
│       │   ├── 11_nova_zone/
│       │   │   └── main.dart
│       │   ├── 12_run_zoned/
│       │   │   └── main.dart
│       │   ├── 13_hierarquia_zones/
│       │   │   └── main.dart
│       │   ├── 14_zone_livre_erros/
│       │   │   └── main.dart
│       │   ├── 15_propagacao_erros_zones/
│       │   │   └── main.dart
│       │   ├── 16_propagacao_erros_zones_2/
│       │   │   └── main.dart
│       │   ├── 17_propagacao_erros_zones_3/
│       │   │   └── main.dart
│       │   ├── 18_valores_locais_zones/
│       │   │   └── main.dart
│       │   └── 19_zone_specification/
│       │       └── main.dart
│       ├── 15_capitulo/
│       │   ├── 01_criacao_diretorio/
│       │   │   └── main.dart
│       │   ├── 02_remocao_diretorio/
│       │   │   └── main.dart
│       │   ├── 03_criacao_arquivo/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   ├── 04_escrita_arquivo/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   ├── 05_escrita_arquivo_sob_demanda/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   ├── 06_ler_arquivo/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   └── 07_ler_arquivo_sob_demanda/
│       │       ├── main.dart
│       │       └── teste.txt
│       ├── e_com_voce/
│       │   ├── 02_imc/
│       │   │   └── main.dart
│       │   ├── 03_benchmark_strings/
│       │   │   └── main.dart
│       │   ├── 03_circunferencia/
│       │   │   └── main.dart
│       │   ├── 03_regex_cpf/
│       │   │   └── main.dart
│       │   ├── 04_funcoes_fatorial_recursao/
│       │   │   └── main.dart
│       │   ├── 04_funcoes_fatorial_recursao_closure/
│       │   │   └── main.dart
│       │   ├── 05_try_catch_rethrow/
│       │   │   └── main.dart
│       │   ├── 08_construtor_inicializadores/
│       │   │   └── main.dart
│       │   ├── 08_redirecionando_construtores/
│       │   │   └── main.dart
│       │   ├── 08_singleton/
│       │   │   └── main.dart
│       │   ├── 09_bidirectional_iterator/
│       │   │   └── main.dart
│       │   ├── 09_programador_comparable/
│       │   │   └── main.dart
│       │   ├── 09_teoria_conjuntos_set/
│       │   │   └── main.dart
│       │   ├── 10_microtask_infinita/
│       │   │   └── main.dart
│       │   ├── 13_gerador_divisores/
│       │   │   └── main.dart
│       │   ├── 13_gerador_valores_impar/
│       │   │   └── main.dart
│       │   ├── 13_stream_transformer_email/
│       │   │   └── main.dart
│       │   ├── 13_stream_transformer_telefone/
│       │   │   └── main.dart
│       │   ├── 14_isolate_bidirecional_stream_channel/
│       │   │   ├── main.dart
│       │   │   └── pubspec.yaml
│       │   ├── 15_climatempo_isolate_diretorios/
│       │   │   ├── .gitignore
│       │   │   ├── CHANGELOG.md
│       │   │   ├── README.md
│       │   │   ├── analysis_options.yaml
│       │   │   ├── bin/
│       │   │   │   └── climatempo.dart
│       │   │   ├── lib/
│       │   │   │   ├── alerta_server.dart
│       │   │   │   ├── api.dart
│       │   │   │   ├── log.dart
│       │   │   │   └── model/
│       │   │   │       ├── cidade.dart
│       │   │   │       ├── clima_tempo.dart
│       │   │   │       └── tempo.dart
│       │   │   ├── log/
│       │   │   │   ├── cidades.txt
│       │   │   │   ├── clima/
│       │   │   │   │   └── 4915.txt
│       │   │   │   └── erro/
│       │   │   │       └── io/
│       │   │   │           └── io.txt
│       │   │   └── pubspec.yaml
│       │   ├── 15_climatempo_isolate_erros/
│       │   │   ├── .gitignore
│       │   │   ├── CHANGELOG.md
│       │   │   ├── README.md
│       │   │   ├── analysis_options.yaml
│       │   │   ├── bin/
│       │   │   │   └── climatempo.dart
│       │   │   ├── lib/
│       │   │   │   ├── alerta_server.dart
│       │   │   │   ├── api.dart
│       │   │   │   ├── log.dart
│       │   │   │   └── model/
│       │   │   │       ├── cidade.dart
│       │   │   │       ├── clima_tempo.dart
│       │   │   │       └── tempo.dart
│       │   │   ├── log/
│       │   │   │   ├── 13032022.txt
│       │   │   │   ├── 4915.txt
│       │   │   │   ├── cidades.txt
│       │   │   │   └── io.txt
│       │   │   └── pubspec.yaml
│       │   └── 15_climatempo_isolate_zone/
│       │       ├── .gitignore
│       │       ├── CHANGELOG.md
│       │       ├── README.md
│       │       ├── analysis_options.yaml
│       │       ├── bin/
│       │       │   └── climatempo.dart
│       │       ├── lib/
│       │       │   ├── alerta_server.dart
│       │       │   ├── api.dart
│       │       │   ├── log.dart
│       │       │   └── model/
│       │       │       ├── cidade.dart
│       │       │       ├── clima_tempo.dart
│       │       │       └── tempo.dart
│       │       ├── log/
│       │       │   ├── 13032022.txt
│       │       │   ├── 4915.txt
│       │       │   ├── cidades.txt
│       │       │   └── io.txt
│       │       └── pubspec.yaml
│       └── na_pratica/
│           ├── 03_strings_palindromo/
│           │   └── main.dart
│           ├── 04_pedra_papel_tesoura_lagarto_spock/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── lib/
│           │   │   └── src/
│           │   │       ├── partida.dart
│           │   │       └── resultado.dart
│           │   ├── pubspec.yaml
│           │   └── web/
│           │       ├── index.html
│           │       ├── main.dart
│           │       └── styles.css
│           ├── 06_logger_library/
│           │   └── lib/
│           │       ├── log/
│           │       │   ├── log.dart
│           │       │   └── printer.dart
│           │       └── main.dart
│           ├── 07_logger_package/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── doc/
│           │   │   └── api/
│           │   │       ├── __404error.html
│           │   │       ├── categories.json
│           │   │       ├── index.html
│           │   │       ├── index.json
│           │   │       ├── logger/
│           │   │       │   ├── Cores/
│           │   │       │   │   ├── Cores.html
│           │   │       │   │   ├── ansi.html
│           │   │       │   │   ├── toString.html
│           │   │       │   │   └── values-constant.html
│           │   │       │   ├── Cores-enum-sidebar.html
│           │   │       │   ├── Cores.html
│           │   │       │   ├── Logger/
│           │   │       │   │   ├── Logger.html
│           │   │       │   │   ├── error.html
│           │   │       │   │   ├── info.html
│           │   │       │   │   ├── nivel.html
│           │   │       │   │   ├── printer.html
│           │   │       │   │   └── warning.html
│           │   │       │   ├── Logger-class-sidebar.html
│           │   │       │   ├── Logger-class.html
│           │   │       │   ├── Nivel/
│           │   │       │   │   ├── Nivel.html
│           │   │       │   │   ├── toString.html
│           │   │       │   │   └── values-constant.html
│           │   │       │   ├── Nivel-enum-sidebar.html
│           │   │       │   ├── Nivel.html
│           │   │       │   ├── Printer/
│           │   │       │   │   ├── Printer.html
│           │   │       │   │   ├── fim.html
│           │   │       │   │   ├── inicio.html
│           │   │       │   │   └── log.html
│           │   │       │   ├── Printer-class-sidebar.html
│           │   │       │   ├── Printer-class.html
│           │   │       │   ├── ansiCores-constant.html
│           │   │       │   ├── logger-library-sidebar.html
│           │   │       │   ├── logger-library.html
│           │   │       │   └── resetarCor-constant.html
│           │   │       ├── search.html
│           │   │       └── static-assets/
│           │   │           ├── docs.dart.js
│           │   │           ├── github.css
│           │   │           ├── highlight.pack.js
│           │   │           ├── readme.md
│           │   │           ├── script.js
│           │   │           └── styles.css
│           │   ├── example/
│           │   │   └── main.dart
│           │   ├── lib/
│           │   │   ├── logger.dart
│           │   │   └── src/
│           │   │       ├── log.dart
│           │   │       ├── printer.dart
│           │   │       ├── printer_console.dart
│           │   │       └── printer_io.dart
│           │   └── pubspec.yaml
│           ├── 11_climatempo/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   ├── climatempo.aot
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── api.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   └── pubspec.yaml
│           ├── 13_climatempo_client/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo_client.dart
│           │   └── pubspec.yaml
│           ├── 13_climatempo_server/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── alerta_server.dart
│           │   │   ├── api.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   └── pubspec.yaml
│           ├── 15_climatempo_arquivos/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── alerta_server.dart
│           │   │   ├── api.dart
│           │   │   ├── log.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   ├── log/
│           │   │   ├── 4915.txt
│           │   │   └── cidades.txt
│           │   └── pubspec.yaml
│           ├── 15_climatempo_arquivos_isolate/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── alerta_server.dart
│           │   │   ├── api.dart
│           │   │   ├── log.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   ├── log/
│           │   │   ├── 4915.txt
│           │   │   └── cidades.txt
│           │   └── pubspec.yaml
│           └── 15_climatempo_arquivos_isolate_zone/
│               ├── .gitignore
│               ├── CHANGELOG.md
│               ├── README.md
│               ├── analysis_options.yaml
│               ├── bin/
│               │   └── climatempo.dart
│               ├── lib/
│               │   ├── alerta_server.dart
│               │   ├── api.dart
│               │   ├── log.dart
│               │   └── model/
│               │       ├── cidade.dart
│               │       ├── clima_tempo.dart
│               │       └── tempo.dart
│               ├── log/
│               │   ├── 13032022.txt
│               │   ├── 4915.txt
│               │   └── cidades.txt
│               └── pubspec.yaml
└── website/
    ├── .gitignore
    ├── README.md
    ├── gatsby-config.js
    ├── package.json
    └── src/
        ├── components/
        │   ├── audience/
        │   │   └── audience.js
        │   ├── author/
        │   │   ├── author.js
        │   │   └── styles.js
        │   ├── book-info/
        │   │   ├── book-info.js
        │   │   └── styles.js
        │   ├── github/
        │   │   ├── github.js
        │   │   └── styles.js
        │   ├── layout/
        │   │   ├── error.js
        │   │   ├── footer/
        │   │   │   ├── footer.js
        │   │   │   └── styles.js
        │   │   ├── global.js
        │   │   ├── header/
        │   │   │   ├── header.js
        │   │   │   └── styles.js
        │   │   ├── layout.js
        │   │   ├── normalize.css
        │   │   ├── styles.js
        │   │   └── theme.js
        │   └── table-of-contents/
        │       ├── styles.js
        │       ├── table-of-contents-full.js
        │       └── table-of-contents.js
        └── pages/
            ├── 404.js
            ├── index.js
            └── table-of-contents.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/deploy.yaml
================================================
name: DartGuide Deploy

on:
  push:
    branches:
      - master
    paths:
      - 'website/**'

jobs:
  build_deploy:
    runs-on: ubuntu-latest
    name: Deploy dartguide.dev
    defaults:
      run:
        working-directory: ./website

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Setup node
        uses: actions/setup-node@v2
        with:
          node-version: '16'

      - name: Install
        run: npm ci

      - name: Build
        run: npm run build

      - name: Deploy
        uses: JamesIves/github-pages-deploy-action@4.1.4
        with:
          branch: gh-pages
          folder: ./website/public


================================================
FILE: .gitignore
================================================
# Files and directories created by pub.
.dart_tool/
.packages

# Conventional directory for build output.
build/

# Mac
.DS_Store
.AppleDouble
.LSOverride

# IntelliJ
.idea
.vscode

================================================
FILE: CNAME
================================================
dartguide.dev

================================================
FILE: README.md
================================================
<p align="center" width="100%">
    <img width="50%" src="https://github.com/JHBitencourt/dart-book/blob/master/website/src/images/promotional_cover_big.png">
</p>



- Informações do livro em [dartguide.dev](http://dartguide.dev)
- [Sumário completo](https://dartguide.dev/table-of-contents/)
- Página do livro na [Casa do Código](https://www.casadocodigo.com.br/products/livro-dart)

Neste repositório você encontrará todos os códigos de exemplos do livro.
Assim como todas as respostas de desafios propostos organizadas nas [issues](https://github.com/JHBitencourt/dart-book/issues).

#### Para acesso rápido aos códigos:

1. [Sessão "Ná Prática"](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/na_pratica)
2. [Sessão "É com você"](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/e_com_voce)
3. [Capítulo 1](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/01_capitulo)
4. [Capítulo 2](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/02_capitulo)
5. [Capítulo 3](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/03_capitulo)
6. [Capítulo 4](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/04_capitulo)
7. [Capítulo 5](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/05_capitulo)
8. [Capítulo 6](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/06_capitulo)
9. [Capítulo 7](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/07_capitulo)
10. [Capítulo 8](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/08_capitulo)
11. [Capítulo 9](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/09_capitulo)
12. [Capítulo 10](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/10_capitulo)
13. [Capítulo 11](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/11_capitulo)
14. [Capítulo 12](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/12_capitulo)
15. [Capítulo 13](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/13_capitulo)
16. [Capítulo 14](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/14_capitulo)
17. [Capítulo 15](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/15_capitulo)


================================================
FILE: code/pt_Br/01_capitulo/01_primeiro_programa/main.dart
================================================
// Primeiro programa o/
main() {
  print('Hello World!');
}

================================================
FILE: code/pt_Br/01_capitulo/02_erro_main/main.dart
================================================
// Tente executar esse arquivo
// Você deverá ver o erro:
// Dart_LoadScriptFromKernel: The binary program does not contain 'main'.
semMain() {
  print('Hello World!');
}

================================================
FILE: code/pt_Br/02_capitulo/01_operadores_aritmeticos/main.dart
================================================
void main() {
  print(40 + 2); // > 42
  print('40' + '2'); // > 402
  print(50 - 8); // > 42
  print(-(-42)); // > 42
  print(6 * 7); // > 42
  print(11 / 2); // > 5.5
  print(11 ~/ 2); // > 5
  print(11 % 2); // > 1
}

================================================
FILE: code/pt_Br/02_capitulo/02_operadores_relacionais_equalidade/main.dart
================================================
void main() {
  print(42 == 42); // > true
  print(42 != 42); // > false
  print(42 > 42); // > false
  print(42 >= 42); // > true
  print(42 < 42); // > false
  print(42 <= 42); // > true
}

================================================
FILE: code/pt_Br/02_capitulo/03_operadores_logicos/main.dart
================================================
void main() {
  print(42 == 42 && 42 <= 10); // > false
  print((42 == 42 && 42 <= 10) || 42 != 42); // > false
  print(!(42 == 42 && 42 <= 10) || 42 != 10); // > true
}

================================================
FILE: code/pt_Br/02_capitulo/04_operador_bit_and/main.dart
================================================
void main() {
  var and = 42 & 27;
  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010
  print(27.toRadixString(2).padLeft(8, '0')); // > 00011011
  print(and); // > 10
  print(and.toRadixString(2).padLeft(8, '0')); // > 00001010
}

================================================
FILE: code/pt_Br/02_capitulo/05_operador_bit_or/main.dart
================================================
void main() {
  var or = 42 | 27;
  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010
  print(27.toRadixString(2).padLeft(8, '0')); // > 00011011
  print(or); // > 59
  print(or.toRadixString(2).padLeft(8, '0')); // > 00111011
}

================================================
FILE: code/pt_Br/02_capitulo/06_operador_bit_xor/main.dart
================================================
void main() {
  var xor = 42 ^ 27;
  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010
  print(27.toRadixString(2).padLeft(8, '0')); // > 00011011
  print(xor); // > 49
  print(xor.toRadixString(2).padLeft(8, '0')); // > 00110001
}

================================================
FILE: code/pt_Br/02_capitulo/07_operador_bit_not/main.dart
================================================
void main() {
  var not = ~42;
  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010
  print(not); // > -43
  print(not.toRadixString(2)); // > -101011
}

================================================
FILE: code/pt_Br/02_capitulo/08_operador_bit_shift_direita/main.dart
================================================
void main() {
  var shift = 42 >> 1;
  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010
  print(shift); // > 21
  print(shift.toRadixString(2).padLeft(8, '0')); // > 00010101
}

================================================
FILE: code/pt_Br/02_capitulo/09_operador_bit_shift_esquerda/main.dart
================================================
void main() {
  var shift = 42 << 2;
  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010
  print(shift); // > 168
  print(shift.toRadixString(2).padLeft(8, '0')); // > 10101000
}

================================================
FILE: code/pt_Br/02_capitulo/10_operador_bit_shift_direita_unsigned/main.dart
================================================
void main() {
  var shift = -42 >>> 1;
  print((-42).toRadixString(2).padLeft(8, '0')); // > 0-101010
  print(shift); // > 9223372036854775787
  print(shift.toRadixString(2));
  // > 111111111111111111111111111111111111111111111111111111111101011
}

================================================
FILE: code/pt_Br/02_capitulo/11_operador_atribuicao/main.dart
================================================
void main() {
  num a = 4;
  print(a); // > 4
  a += 5;
  print(a); // > 9
  a -= 4;
  print(a); // > 5
  a %= 2;
  print(a); // > 1
  a *= 11;
  print(a); // > 11
  a /= 5;
  print(a); // > 2.2
  a ~/= 2;
  print(a); // > 1
  int b = 1;
  b <<= 4;
  print(b); // > 16
  b |= 42;
  print(b); // > 58
  b &= 60;
  print(b); // > 56
  b ^= 42;
  print(b); // > 18
  b >>= 1;
  print(b); // > 9
  b >>>= 1;
  print(b); // > 4
}

================================================
FILE: code/pt_Br/02_capitulo/12_operador_incremento_decremento_1/main.dart
================================================
void main() {
  var a = 0;
  var b = 1 + ++a; // 1 + 1
  print(a); // > 1
  print(b); // > 2
  var c = 0;
  var d = 1 + --c; // 1 + -1
  print(c); // > -1
  print(d); // > 0
}

================================================
FILE: code/pt_Br/02_capitulo/13_operador_incremento_decremento_2/main.dart
================================================
void main() {
  var a = 0;
  var b = 1 + a++; // 1 + 0
  print(a); // > 1
  print(b); // > 1
  var c = 0;
  var d = 1 + c--; // 1 + 0
  print(c); // > -1
  print(d); // > 1
}

================================================
FILE: code/pt_Br/02_capitulo/14_operador_validacao_tipo_1/main.dart
================================================
void main() {
  num a = 42;

  // Ao descomentar a linha abaixo irá produzir um erro de cast de tipo inválido
  // a = 42.5;

  print((a as int).bitLength); // > 6
}

================================================
FILE: code/pt_Br/02_capitulo/15_operador_validacao_tipo_2/main.dart
================================================
void main() {
  num a = 42.5;

  // O operador is permite validar o tipo para evitar erros de cast
  if (a is int) {
    print((a as int).bitLength);
  }

  if (a is! int) {
    print('Não é inteiro'); // > Não é inteiro
  }
}

================================================
FILE: code/pt_Br/02_capitulo/16_operador_cascade/main.dart
================================================
// Sem o operador cascade:
// final frase = StringBuffer();
// frase.write('Operação ');
// frase.write('em ');
// frase.write('cascade.');

void main() {
  final frase = StringBuffer()
    ..write('Operação ')
    ..write('em ')
    ..write('cascade.');
  print(frase); // > Operação em cascade.
}

================================================
FILE: code/pt_Br/02_capitulo/17_operador_spread/main.dart
================================================
void main() {
  final vogais = ['a', 'e', 'i'];
  final consoantes = ['b', 'c', 'd'];
  final alfabeto = [...vogais, ...consoantes];
  print(alfabeto); // > [a, e, i, b, c, d]
}

================================================
FILE: code/pt_Br/02_capitulo/18_operador_ternario/main.dart
================================================
void main() {
  int numero = 42;
  print(numero % 2 == 0 ? 'par' : 'ímpar'); // > par
}

================================================
FILE: code/pt_Br/02_capitulo/19_operador_acesso/main.dart
================================================
void main() {
  final map = {
    'vogais': 'a,e,i,o,u',
    'consoantes': 'b,c,d,...',
  };
  final vogais = ['a', 'e', 'i', 'o', 'u'];
  print(vogais[0]); // > a
  print(vogais[4]); // > u
  print(map['vogais']); // > a,e,i,o,u
}

================================================
FILE: code/pt_Br/02_capitulo/20_operador_ternario_nulo/main.dart
================================================
void main() {
  int? a = null;
  var resposta = a ?? 42;
  print(resposta); // > 42
}

================================================
FILE: code/pt_Br/02_capitulo/21_operador_atribuicao_nulo/main.dart
================================================
void main() {
  int? resposta = null;
  resposta ??= 42;
  print(resposta); // > 42
}

================================================
FILE: code/pt_Br/02_capitulo/22_operador_acesso_nulo/main.dart
================================================
void main() {
  int? resposta = null;
  print(resposta?.bitLength); // > null
}

================================================
FILE: code/pt_Br/02_capitulo/23_operador_cascade_nulo/main.dart
================================================
void main() {
  StringBuffer? frase = null;
  frase?..write('Operação ')
    ..write('em ')
    ..write('cascade.');
  print(frase); // > null
}

================================================
FILE: code/pt_Br/02_capitulo/24_operador_acesso_itens_nulo/main.dart
================================================
void main() {
  List<String>? vogais;
  print(vogais?[1]); // > null
}

================================================
FILE: code/pt_Br/02_capitulo/25_operador_bang/main.dart
================================================
void main() {
  List<String>? vogais;
  print(vogais![1]);
}

================================================
FILE: code/pt_Br/02_capitulo/26_precedencia_operadores/main.dart
================================================
void main() {
  print(1+6/2*3-6); // > 4
}

================================================
FILE: code/pt_Br/02_capitulo/27_if_else/main.dart
================================================
void main() {
  var resposta = 20;
  if (resposta != 42) {
    print('A resposta está errada'); // > A resposta está errada
  } else {
    print('A resposta está correta');
  }

  var imc = 25.1;
  if (imc < 18.5) {
    print('Abaixo do peso');
  } else if (imc >= 18.5 && imc < 24.9) {
    print('Peso normal ideal');
  } else if (imc >= 24.9 && imc < 29.9) {
    print('Sobrepeso'); // > Sobrepeso
  } else {
    print('Obesidade');
  }
}

================================================
FILE: code/pt_Br/02_capitulo/28_switch_case/main.dart
================================================
void main() {
  var estacao = 'Verão';
  switch (estacao) {
    case 'Outono':
    case 'Verão':
      print('Tá calor'); // > Tá calor
      break;
    case 'Inverno':
      print('Tá frio');
      break;
    default:
      print('Tá bom..');
  }

  var dia = 'Domingo';
  switch (dia) {
    segunda:
    case 'Segunda':
      print('Aff, já é segunda..');
      break;
    case 'Terça':
      print('Usando um feitiço do tempo..');
      continue sexta;
    case 'Quarta':
    case 'Quinta':
      throw 'Meio da semana';
    sexta:
    case 'Sexta':
      print('Sexxxxtou!');
      break;
    case 'Sábado':
      return;
    case 'Domingo':
      print('Aproveitando enquanto dá..');
      continue segunda;
    default:
      print('Esse dia não existe..');
  }
}

================================================
FILE: code/pt_Br/02_capitulo/29_switch_case_patterns/main.dart
================================================
void main() {
  var nota = 8;
  switch (nota) {
    case 0:
      print('Sério?');
    case 1 || 2 || 3:
      print('Estudar mais, urgente!');
    case >= 4 && <= 6:
      print('Tá quase lá..');
    case > 6 && <= 8:
      print('Tá na média!'); // > Tá na média
    case > 8 when nota <= 10:
      print('GOAT!');
    default:
      print('Nota inválida');
  }
}

================================================
FILE: code/pt_Br/02_capitulo/30_switch_case_expressions/main.dart
================================================
void main() {
  var nota = 9;
  var mensagem = switch (nota) {
    0 => 'Sério?',
    1 || 2 || 3 => 'Estudar mais, urgente!',
    >= 4 && <= 6 => 'Tá quase lá..',
    > 6 && <= 8 => 'Tá na média!',
    > 8 when nota <= 10 => 'GOAT!',
    _ => 'Nota inválida'
  };
  print(mensagem); // > GOAT! 
}

================================================
FILE: code/pt_Br/02_capitulo/31_if_case/main.dart
================================================
void main() {
  var coordenadas = [10, 42];
  if (coordenadas case [int x, int y]) {
    print('Coordenadas: (x:$x,y:$y)'); // > Coordenadas: (x:10,y:42)
  } else {
    print('Coordenadas inválidas');
  }
}

================================================
FILE: code/pt_Br/02_capitulo/32_if_case_when/main.dart
================================================
void main() {
  var coordenadas = [10, -42];
  if (coordenadas case [int x, int y] when x >= 0 && y >= 0) {
    print('Coordenadas: (x:$x,y:$y)');
  }
}

================================================
FILE: code/pt_Br/02_capitulo/33_while/main.dart
================================================
void main() {
  var index = 0;
  while(index < 3) {
    print(index);
    index++;
  }
}

================================================
FILE: code/pt_Br/02_capitulo/34_do_while/main.dart
================================================
void main() {
  do {
    print('Executado'); // > Executado
  } while (false);
}

================================================
FILE: code/pt_Br/02_capitulo/35_for/main.dart
================================================
void main() {
  for(var i = 0; i <= 10; i = i+2) {
    print(i); // > 0 2 4 6 8 10
  }

  // for com continue e break
  for (var i = 0; i <= 10; i++) {
    if (i % 2 == 0) continue;
    if (i > 7) break;
    print(i); // > 1 3 5 7
  }
}

================================================
FILE: code/pt_Br/02_capitulo/36_for_nomeado/main.dart
================================================
void main() {
  forDeFora:
  for (var i = 0; i <= 2; i++) {
    print('forDeFora $i');
    for (var j = 0; j <= 2; j++) {
      if (j >= 1 || i == 1) continue forDeFora;
      print('forDeDentro $j');
    }
  }
}

================================================
FILE: code/pt_Br/02_capitulo/37_for_in/main.dart
================================================
void main() {
  final vogais = ['a', 'e', 'i', 'o', 'u'];
  for(final vogal in vogais) {
    if(vogal == 'e') continue;
    if(vogal == 'u') break;
    print(vogal); // > a i o
  }
}

================================================
FILE: code/pt_Br/02_capitulo/38_assert/main.dart
================================================
void main() {
  final vogais = ['a', 'e', 'i', 'o', 'u', 'j'];
  assert(vogais.length == 5, 'Só deveriam existir 5 vogais!');
}

================================================
FILE: code/pt_Br/03_capitulo/01_coercao/main.dart
================================================
// Coerção implícita em javascript:
// var a = "Resposta: " + 42;
// console.log(a); // >	"Resposta:	42"

void main() {
  var a = 'Resposta:' + 42.toString();
  print(a); // > Resposta: 42
}


================================================
FILE: code/pt_Br/03_capitulo/02_dart_analyzer_1/main.dart
================================================
bool erro = true;

void main() {
  // O analisador de dart apontará um erro no código abaixo:
  erro = 'false';
}


================================================
FILE: code/pt_Br/03_capitulo/03_dart_analyzer_2/main.dart
================================================
bool erro = true;

void main() {
  erro as String;
}


================================================
FILE: code/pt_Br/03_capitulo/04_inferencia_tipo/main.dart
================================================
void main() {
  int continentes = 6;
  print(continentes.runtimeType); // > int
  var planetas = 8;
  print(planetas.runtimeType); // > int
}


================================================
FILE: code/pt_Br/03_capitulo/05_inferencia_tipo_parametros/main.dart
================================================
void main() {
  var somaInt = soma(1, 2);
  var somaString = soma('1', '2');
  print('$somaInt: ${somaInt.runtimeType}'); // > 3: int
  print('$somaString: ${somaString.runtimeType}'); // > 12: String
}

soma(a, b) => a + b;


================================================
FILE: code/pt_Br/03_capitulo/06_dynamic/main.dart
================================================
void main() {
  dynamic objeto = 42;
  // Uma exceção será lançada em tempo de execução:
  objeto.metodoQueNemExiste(); // > NoSuchMethodError
}


================================================
FILE: code/pt_Br/03_capitulo/07_numeros/main.dart
================================================
void main() {
  int a = 5;
  double b = 8.2;
  double c = 1;
  num x = (a * b) + c;
  print('Resultado: $x'); // > Resultado: 42
  print('a: ${a.runtimeType}'); // > a: int
  print('b: ${b.runtimeType}'); // > b: double
  print('x: ${x.runtimeType}'); // > x: double
}


================================================
FILE: code/pt_Br/03_capitulo/08_booleanos/main.dart
================================================
void main() {
  bool verdadeiro = true;
  bool falso = false;
  bool primeiroMaior = 'Esse é muito maior'.length > 'Esse é grande'.length;
  print('Primeiro é maior? ${primeiroMaior && (verdadeiro || falso)}');
  // > Primeiro é maior? true
  print('verdadeiro: ${verdadeiro.runtimeType}');
  // > verdadeiro: bool
}


================================================
FILE: code/pt_Br/03_capitulo/09_symbols/main.dart
================================================
void main() {
  var mod = #modificador;
  print(#modificador); // > Symbol("modificador")
  print(mod); // > Symbol("modificador")
  print('mod: ${mod.runtimeType}'); // > mod: Symbol
}

================================================
FILE: code/pt_Br/03_capitulo/10_null_safety/main.dart
================================================
// A null-safety em Dart não permite que o código abaixo compile
void main() {
  int valor;
  print(valor.isEven);
}


================================================
FILE: code/pt_Br/03_capitulo/11_nullable_types/main.dart
================================================
void main() {
  printNome('Douglas', 'Adams');
  printNome('Douglas', null);
}

void printNome(String nome, String? sobrenome) {
  print('$nome $sobrenome');
}

void valorImpar(int numero) {
  print(numero.isEven);
}
// O compilador não permite acessar as propriedades dos tipos em tipos nullable:
// void valorImparNullable(int? numero) {
//   print(numero.isEven);
// }

================================================
FILE: code/pt_Br/03_capitulo/12_type_promotion/main.dart
================================================
void main() {
  print(textoGrande(42));
  print(textoGrande('Este tem que ser um texto muito grande com mais de 120 '
      'caracteres para que a função retorne verdadeiro. Parabéns pra você'
      'que está lendo esse livro. :) S2 '));
}

bool textoGrande(Object objeto) {
  if (objeto is String) {
    return objeto.length > 120;
  } else {
    return false;
  }
}


================================================
FILE: code/pt_Br/03_capitulo/13_type_promotion_nullable/main.dart
================================================
void main() {
  print(letrasNome('Julio', 'Bitencourt'));
  print(letrasNome('Julio', null));

  print(letrasNome2('Julio', 'Bitencourt'));
  print(letrasNome2('Julio', null));
}

List<String> letrasNome(String nome, String? sobrenome) {
  var letras = nome.split('');
  if (sobrenome != null) {
    letras.addAll(sobrenome.split(''));
  }
  return letras;
}

List<String> letrasNome2(String nome, String? sobrenome) {
  var letras = nome.split('');
  if (sobrenome == null) return letras;
  letras.addAll(sobrenome.split(''));
  return letras;
}


================================================
FILE: code/pt_Br/03_capitulo/14_operador_bang/main.dart
================================================
String? nome;

void main() {
  nome = 'Julio';

  // Erro de compilação, afinal nome é uma variável global:
  // if (nome != null) print(nome.length);

  // Acessando com operador de cast
  if (nome != null) print((nome as String).length);

  // Acessando com o bang
  if (nome != null) print(nome!.length);
}


================================================
FILE: code/pt_Br/03_capitulo/15_strings/main.dart
================================================
void main() {
  //String('Erro'); // Sem construtor default
  var a = '42'; // Forma literal
  print(a); // > 42
  print(a.codeUnits); // > [52, 50]
  print(String.fromCharCode(52)+String.fromCharCode(50)); // > 42
}

================================================
FILE: code/pt_Br/03_capitulo/16_surrogate_pairs/main.dart
================================================
void main() {
  var spock = '\u{1f596}';
  print(spock); // Imprime o símbolo
  print(spock.length); // > 2
  print(spock.codeUnits); // > [55357, 56726]
  print(spock.runes); // > (128406)
  print(String.fromCharCode(55357) + String.fromCharCode(56726));
  // Imprime o símbolo
}

================================================
FILE: code/pt_Br/03_capitulo/17_criacao_strings/main.dart
================================================
void main() {
  print("Aspas duplas com 'aspas simples'");
  // > Aspas duplas com 'aspas simples'
  print('Aspas simples com "aspas duplas"');
  // > Aspas simples com "aspas duplas"
  print('''Mais de 
    uma linha''');
  print(r'Unicode = \u{1f596}'); // > Unicode = \u{1f596}
}


================================================
FILE: code/pt_Br/03_capitulo/18_interpolacao_strings/main.dart
================================================
var resposta = 42;

void main() {
  print('''A resposta para a vida
    o universo
    e tudo mais é: $resposta''');
  print('42 * 42 = ${resposta * resposta}'); // > 42 * 42 = 1764
  print('Variável: = \$resposta'); // > Variável: = $resposta
  print(r'Variável: = $resposta'); // > Variável: = $resposta
}


================================================
FILE: code/pt_Br/03_capitulo/19_otimizacao_strings/main.dart
================================================
var elonUm = 'Elon Musk';
var elonDois = 'Elon Musk';
var jeff = 'Jeff Bezos';

void main() {
  print(elonUm == jeff); // > false
  print(identical(elonUm, jeff)); // > false
  print(elonUm == elonDois); // > true
  print(identical(elonUm, elonDois)); // > true
}


================================================
FILE: code/pt_Br/03_capitulo/20_strings_sob_demanda/main.dart
================================================
void main() {
  print('Dart' + ' é ' + 'incrível!'); // > Dart é incrível!
  print('Dart' ' é ' 'incrível!'); // > Dart é incrível!
  var buffer = StringBuffer();
  buffer.write('Dart é');
  buffer.write(' incrível!');
  buffer.writeAll(['E esse', ' livro ', 'também!']);
  print(buffer); // > Dart é incrível!E esse livro também!
}


================================================
FILE: code/pt_Br/03_capitulo/21_strings_geral/main.dart
================================================
String e = 'Douglas Adams';

void main() {
  print('Vazio: ${e.isEmpty}'); // > Vazio: false
  print("Adicionando à esquerda '>': ${e.padLeft(15, '>')}");
  // > Adicionando à esquerda '>': >>Douglas Adams
  print("Adicionando à direita '<': ${e.padRight(16, '<')}");
  // > Adicionando à direita '<': Douglas Adams<<<
  print("Mudar todos 'a' para 'e': ${e.replaceAll('a', 'e')}");
  // > Mudar todos 'a' para 'e': Dougles Adems
  print("Mudar primeiro 'a' para 'e': ${e.replaceFirst('a', 'e')}");
  // > Mudar primeiro 'a' para 'e': Dougles Adams
  print("Dividindo: ${e.split(" ")[0]}"); // > Dividindo: Douglas
  print("Dividindo: ${e.split(" ")[1]}"); // > Dividindo: Adams
  print('''Matching:
    Contém 'gl': ${e.contains("gl")}
    Termina com 'Adams': ${e.endsWith("Adams")}
    Começa com 'D': ${e.startsWith("d".toUpperCase())}''');
}


================================================
FILE: code/pt_Br/03_capitulo/22_variaveis_var/main.dart
================================================
var pi = 3.14;
double y = pi;
var x = 'Arquimedes';
String? matematico;

void main() {
  //x = y; // Erro, x já possui o tipo String.
  matematico = x;
  print(matematico); // > Arquimedes
}


================================================
FILE: code/pt_Br/03_capitulo/23_variaveis_static/main.dart
================================================
//static var global = 'String global'; // Erro
class Livro {
  static int instancias = 0;

  Livro() {
    instancias++;
  }

  String autor = 'Douglas Adams';
}

void main() {
  print('Instâncias: ${Livro.instancias}');
  Livro();
  Livro();
  print('Autor: ${Livro().autor}');
  print('Instâncias: ${Livro.instancias}');
}


================================================
FILE: code/pt_Br/03_capitulo/24_variaveis_final_const/main.dart
================================================
// const double pi =  3.14;
const pi = 3.14;
// final double circunferencia = 2 * pi;
final circunferencia = 2 * pi;

/// O código abaixo produz um erro de compilação, afinal variáveis const
/// são definidas em tempo de compilação, enquanto final são em tempo de execução
// final pi =  3.14;
// const circunferencia = 2 * pi;

/// Lista com valores constantes:
var valoresConstantes = const [1, 2, 3];

final listFinal = [1, 2, 3];
const listConst = [1, 2, 3];

void main() {
  /// Objetos constantes são canonicalizados:
  var a = getValorCanonicalizado();
  var b = getValorCanonicalizado();
  print('A e B são os mesmos objetos? ${identical(a, b)}');
  // > 'A e B são os mesmos objetos? true'

  /// Objetos constantes são imutáveis, não é permitido adicionar valores em uma
  /// lista constante:
  listFinal[0] = 4; // é permitido
  // listConst[0] = 4; // erro de execução
}

List getValorCanonicalizado() => const [4, 5, 6];


================================================
FILE: code/pt_Br/03_capitulo/25_variaveis_late/main.dart
================================================
class Pizza {
  // int pedacos;
  late int pedacos;

  void media() {
    pedacos = 8;
  }

  void grande() {
    pedacos = 16;
  }

  String servir() => '$pedacos pedaços servidos!';
}

void main() {
  final pizza = Pizza();
  pizza.media();
  print(pizza.servir()); // > 8 pedaços servidos!
}


================================================
FILE: code/pt_Br/04_capitulo/01_fatorial/main.dart
================================================
void main() {
  print(fatorial(4));
  print(fatorial(0));
  print(fatorial(42));
}

int fatorial(int numero) {
  if (numero == 0) return 1;
  var resultado = 1;
  for (var i = 1; i <= numero; i++) {
    resultado *= i;
  }
  return resultado;
}


================================================
FILE: code/pt_Br/04_capitulo/02_escopo/main.dart
================================================
var escopoGlobal = 'global';

void main() {
  var escopoMain = 'escopoMain';
  a() {
    var escopoDentro = 'escopoA';
    print('a: $escopoGlobal - $escopoMain - $escopoDentro');
    b() {
      var escopoDentro = 'escopoB';
      print('b: $escopoGlobal - $escopoMain - $escopoDentro');
    }
    b();
  }
  c() {
    a();
  }
  c();
  print('main: $escopoGlobal - $escopoMain');
}

================================================
FILE: code/pt_Br/04_capitulo/03_tipo_function/main.dart
================================================
var ola = (String nome) {
  print('Olá $nome');
};
Function hello = (String nome) => print('Olá $nome');

void main() {
  ola('Julio'); // > Olá Julio
  ola('${ola.runtimeType}'); // > Olá (String) => Null

  hello('Julio'); // > Olá Julio
  hello('${hello.runtimeType}'); // > Olá (String) => void
}


================================================
FILE: code/pt_Br/04_capitulo/04_retornos/main.dart
================================================
void main() {
  print(retornoNulo());
  print(retornoNuloDois());
  print(retornoString());

  /// Um retorno void não pode ser utilizado:
  // var objeto = retornoDynamic();
  // print(objeto);
}

retornoNulo() {}

retornoNuloDois() {
  return;
}

retornoString() {
  return 'String';
}

void semRetorno() {}

void retornoVazio() {
  return;
}

void retornoDynamic() {
  dynamic dinamico = 'dynamic';
  return dinamico;
}

void retornoFuncao() {
  return print('retornoFuncao');
}


================================================
FILE: code/pt_Br/04_capitulo/05_never/main.dart
================================================
import 'dart:io';

void main() {
  print('Antes de encerrar');
  exit(0);
  print('Após encerrar');
}


================================================
FILE: code/pt_Br/04_capitulo/06_escopo_closure/main.dart
================================================
Function criaClosure() {
  var resposta = 42;
  return () {
    resposta++;
    print(resposta);
  };
}

void main() {
  var somaImprime = criaClosure();
  somaImprime();
  somaImprime();
}


================================================
FILE: code/pt_Br/04_capitulo/07_tear_off/main.dart
================================================
void main() {
  final vogais = ['a', 'e', 'i', 'o', 'u'];
  vogais.forEach((e) {
    print(e);
  });

  /// Usando tear-off:
  vogais.forEach(print);
}


================================================
FILE: code/pt_Br/04_capitulo/08_parametro_posicional_obrigatorio/main.dart
================================================
/// Parâmetros: posicional e obrigatório
void temperaturaEm(String cidade, int? ano, int? mes, int dia) {
  print('$cidade $dia/$mes/$ano');
}

void main() {
  temperaturaEm('Floripa', null, 12, 1); // > Floripa 1/12/null
}


================================================
FILE: code/pt_Br/04_capitulo/09_parametro_posicional_opcional/main.dart
================================================
void temperaturaEm(String cidade, [int? ano = 2020, int? mes, int dia = 01]) {
  print('$cidade $dia/$mes/$ano');
}

void main() {
  temperaturaEm('Floripa'); // > Floripa 1/null/2020
  temperaturaEm('Floripa', null); // > Floripa 1/null/null
  temperaturaEm('Floripa', 2021, 1); // > Floripa 1/1/2021
  temperaturaEm('Floripa', 2021, 1, 2); // > Floripa 2/1/2021
}


================================================
FILE: code/pt_Br/04_capitulo/10_parametro_nomeado_opcional/main.dart
================================================
void temperaturaEm(String cidade, {int? ano = 2020, int dia = 01, int? mes}) {
  print('$cidade $dia/$mes/$ano');
}

void main() {
  temperaturaEm('Floripa', ano: 2021); // > Floripa 1/null/2021
  temperaturaEm('Floripa', mes: 1); // > Floripa 1/1/2020
  temperaturaEm('Floripa', mes: 1, dia: 2, ano: null); // > Floripa 2/1/null
}


================================================
FILE: code/pt_Br/04_capitulo/11_parametro_nomeado_obrigatorio/main.dart
================================================
void temperaturaEm(String cidade,
    {required int dia, required int? mes, int? ano = 2020}) {
  print('$cidade $dia/$mes/$ano');
}

void main() {
  temperaturaEm('Floripa', dia: 1, mes: null); // > Floripa 1/null/2020
  temperaturaEm('Floripa', mes: 1, dia: 12); // > Floripa 12/12/2020
  temperaturaEm('Floripa', mes: 1, dia: 2, ano: 2021); // > Floripa 2/1/2021
}


================================================
FILE: code/pt_Br/04_capitulo/12_enums/main.dart
================================================
const double G = 6.67300e-11;

enum Planeta {
  mercurio(3.303e+23, 2.4397e6, aneis: false),
  venus(4.869e+24, 6.0518e6, aneis: false),
  terra(5.976e+24, 6.37814e6, aneis: false),
  marte(6.421e+23, 3.3972e6, aneis: false),
  jupiter(1.9e+27, 7.1492e7, aneis: true),
  saturno(5.688e+26, 6.0268e7, aneis: true),
  urano(8.686e+25, 2.5559e7, aneis: true),
  netuno(1.024e+26, 2.4746e7, aneis: true);

  const Planeta(this.massa, this.raio, {required this.aneis});

  factory Planeta.planetaComVida() => Planeta.terra;

  final bool aneis;
  final double massa;
  final double raio;

  bool get ehAzul => this == Planeta.terra;
  double gravidadeSuperficial() => G * massa / (raio * raio);
  double pesoSuperficie(double massaCorpo) =>
      massaCorpo * gravidadeSuperficial();
}

void main() {
  print(Planeta.planetaComVida());
  print(Planeta.marte.ehAzul);
  final peso = 80 / Planeta.terra.gravidadeSuperficial();
  for (final p in Planeta.values) {
    print('Meu peso em ${p.name}: ${p.pesoSuperficie(peso)}kg');
  }
}

================================================
FILE: code/pt_Br/04_capitulo/13_typedef/main.dart
================================================
typedef Operacao = Object Function(double a, double b);

double somar(double a, double b) {
  return a + b;
}

String subtrair(double a, double b) {
  return (a - b).toString();
}

Object calcular(double a, double b, Operacao operacao) {
  return operacao(a, b);
}

void main() {
  print(calcular(22, 20, somar)); // > 42.0
  print(calcular(22, 20, subtrair)); // > 2.0
}


================================================
FILE: code/pt_Br/05_capitulo/01_errors/main.dart
================================================
void main() {
  var lista = <int>[1, 2];
  for (var i = 0; i <= 2; i++) {
    print('Atribuindo valor $i no índice $i');
    lista[i] = i;
  }
}


================================================
FILE: code/pt_Br/05_capitulo/02_exceptions/main.dart
================================================
import 'dart:io';

void main() {
  // Um formato inválido informado resultará em FormatException
  final dataUsuario = stdin.readLineSync();
  DateTime.parse(dataUsuario!);
}


================================================
FILE: code/pt_Br/05_capitulo/03_throw/main.dart
================================================
void voar() {
  throw Exception('Você não tem asas!');
}

void ligarCarro() => throw 'Sem gasolina!';

void main() {
  // voar();
  ligarCarro();
}


================================================
FILE: code/pt_Br/05_capitulo/04_exception_customizada/main.dart
================================================
class SemGasolinaException implements Exception {
  final String mensagem;

  const SemGasolinaException(this.mensagem);

  String toString() => 'SemGasolinaException: $mensagem';
}

void ligarCarro() => throw SemGasolinaException('Carro sem gasolina..');

void main() {
  ligarCarro();
}


================================================
FILE: code/pt_Br/05_capitulo/05_assert/main.dart
================================================
void main() {
  int? id;
  assert(id != null, 'O id não pode ser nulo.');
}


================================================
FILE: code/pt_Br/05_capitulo/06_assert_x_error/main.dart
================================================
import 'dart:math';

void main() {
  // calcularCircunferencia(-2);
  calcularCircunferenciaError(-2);

  Motorista('', 14);
  MotoristaError('', 14);
}

double calcularCircunferencia(double raio) {
  assert(raio >= 0, 'O raio deve ser positivo.');
  return 2 * pi * raio;
}

double calcularCircunferenciaError(double raio) {
  if (raio < 0) throw AssertionError('O raio deve ser positivo.');
  return 2 * pi * raio;
}

class Motorista {
  final String nome;
  final int idade;

  const Motorista(this.nome, this.idade)
      : assert(nome != '', 'O nome não pode ser vazio'),
        assert(idade >= 18, 'O motorista deve ser maior de idade');
}

class MotoristaError {
  final String nome;
  final int idade;

  MotoristaError(this.nome, this.idade) {
    if (nome.isEmpty) throw AssertionError('O nome não pode ser vazio');
    if (idade < 18) throw AssertionError('O motorista deve ser maior de idade');
  }
}


================================================
FILE: code/pt_Br/05_capitulo/07_try_catch/main.dart
================================================
void comer() => throw Exception('Acabou a comida..');

void main() {
  try {
    comer();
    print('Não vai chegar aqui..');
  } catch (e, s) {
    print('Exceção capturada: $e');
    print('Stacktrace: $s');
  }
}


================================================
FILE: code/pt_Br/05_capitulo/08_try_catch_on/main.dart
================================================
void main() {
  try {
    DateTime.parse('01/01/2022');
    // DateTime.parse('2022-01-22');
  } on FormatException catch (e) {
    print('O formato deve ser ano-mes-dia.. $e');
  } catch (e, s) {
    print('Exceção capturada: $e');
    print('Stacktrace: $s');
  }
}


================================================
FILE: code/pt_Br/05_capitulo/09_try_catch_exception/main.dart
================================================
void comer() => throw 'Acabou	a	comida..';

void main() {
  try {
    comer();
  } on FormatException catch (e) {
    print('O formato  de data deve ser ano-mes-dia.. $e');
  } on Exception catch (e, s) {
    print('Exceção capturada: $e');
    print('Stacktrace: $s');
  }
}


================================================
FILE: code/pt_Br/05_capitulo/10_try_catch_finally/main.dart
================================================
import 'dart:async';

void main() {
  try {
    abrirConexao();
    buscarDados();
    // fecharConexao();
  } catch (e, s) {
    print('Exceção capturada: $e');
    print('Stacktrace: $s');
  } finally {
    fecharConexao();
  }
}

void abrirConexao() => print('Conexão aberta..');

void buscarDados() => throw TimeoutException('Rede lenta..');

void fecharConexao() => print('Conexão fechada..');


================================================
FILE: code/pt_Br/06_capitulo/01_codigo_ansi/main.dart
================================================
import 'dart:io';

void error(Object object) {
  stdout.writeln('\x1b[31m[ERROR]	$object\x1b[m');
}

void main() {
  /// O texto será impresso em vermelho no terminal:
  error('Um texto de erro!');
}

================================================
FILE: code/pt_Br/07_capitulo/01_analyzer/main.dart
================================================
/// Execute o analyzer neste arquivo e deverá ser apontado 1 erro e nenhuma
/// melhoria. Afinal, ele não possui um linter configurado.
class pessoa {
  pessoa({this.nome = null});

  final String? nome

  void DizerOi() {
    print('Olá!	Me	chamo	$nome');
  }
}

main() {
  final julio = new pessoa(nome: 'Julio');
  julio.DizerOi();
}

================================================
FILE: code/pt_Br/07_capitulo/02_analyzer_linter/analysis_options.yaml
================================================
linter:
  rules:
    - camel_case_types
    - non_constant_identifier_names
    - avoid_init_to_null
    - always_declare_return_types
    - unnecessary_new

================================================
FILE: code/pt_Br/07_capitulo/02_analyzer_linter/main.dart
================================================
/// Execute o analyzer neste arquivo e deverá ser apontado 5 melhorias.
/// Afinal, ele possui o linter configurado em analysis_options.dart
class pessoa {
  pessoa({this.nome = null});

  final String? nome;

  void DizerOi() {
    print('Olá!	Me	chamo	$nome');
  }
}

main() {
  final julio = new pessoa(nome: 'Julio');
  julio.DizerOi();
}

================================================
FILE: code/pt_Br/07_capitulo/03_comments/main.dart
================================================
// TODO finalizar este método
void imprimirValor() {
  print(42); // Imprime sempre 42.
}

/* // TODO finalizar este método
void imprimirValor() {
  print(42); // Imprime sempre 42.
  Todo esse trecho de código é tratado como comentário..
} */

/// Três barras formam um comentário de documentação do código, que é exportado
/// com o comando `dart doc`.
///
/// Código ANSI para resetar a cor do terminal
const resetarCor = '\x1b[m';

================================================
FILE: code/pt_Br/08_capitulo/01_objeto/main.dart
================================================
class Programador {
  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}
}

void main() {
  final programador = Programador()..nome = 'Julio Bitencourt';
  programador.tarefas.add('Terminar livro de Dart');

  print(programador.runtimeType);
  print(programador.toString());
}


================================================
FILE: code/pt_Br/08_capitulo/02_to_string/main.dart
================================================
class Programador {
  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}

  @override
  String toString() => '$nome';
}

void main() {
  final p1 = Programador()..nome = 'Julio';
  print(p1); // > Julio
}


================================================
FILE: code/pt_Br/08_capitulo/03_equalidade/main.dart
================================================
class Programador {
  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}

  @override
  String toString() => '$nome';
}

void main() {
  final p1 = Programador()..nome = 'Julio';
  final p2 = Programador()..nome = 'Julio';
  print(p1 == p2); // > false
  print('hash p1: ${p1.hashCode} - hash p2: ${p2.hashCode}');
  // > hash p1: 624437211 - hash p2: 125619715
}


================================================
FILE: code/pt_Br/08_capitulo/04_sobrescrita_operadores/main.dart
================================================
class Programador {
  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}

  @override
  String toString() => '$nome';

  @override
  bool operator ==(Object other) => other is Programador && nome == other.nome;

  @override
  int get hashCode => nome.hashCode;
}

void main() {
  final p1 = Programador()..nome = 'Julio';
  final p2 = Programador()..nome = 'Julio';
  print(p1 == p2); // > true
  print(identical(p1, p2)); // > false
  print('hash p1: ${p1.hashCode} - hash p2: ${p2.hashCode}');
  // > hash p1: 514913100 - hash p2: 514913100
}


================================================
FILE: code/pt_Br/08_capitulo/05_construtor_padrao/main.dart
================================================
class Programador {
  // Programador(String nome, List<String> linguagens) {
  //   this.nome = nome;
  //   this.linguagens = linguagens;
  // }

  /// Syntax sugar para a forma acima:
  // Programador(this.nome, this.linguagens);

  /// Construtor padrão com parâmetros opcionais e valores default:
  Programador({this.nome = 'Fulano', this.linguagens = const []});

  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}

  @override
  String toString() => '$nome';

  @override
  bool operator ==(Object other) => other is Programador && nome == other.nome;

  @override
  int get hashCode => nome.hashCode;
}

void main() {
  final p1 = Programador();
  final p2 = Programador(nome: 'Julio', linguagens: ['Dart']);
  print(p1);
  print(p2);
}


================================================
FILE: code/pt_Br/08_capitulo/06_construtor_nomeado/main.dart
================================================
class Programador {
  Programador({
    this.nome = 'Fulano',
    this.linguagens = const [],
  });

  Programador.dart(this.nome) {
    linguagens = ['Dart'];
  }

  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}

  @override
  String toString() => '$nome';

  @override
  bool operator ==(Object other) => other is Programador && nome == other.nome;

  @override
  int get hashCode => nome.hashCode;
}

void main() {
  final p1 = Programador(nome: 'James Gosling', linguagens: ['Java']);
  final p2 = Programador.dart('Julio');
  print('$p1 ama ${p1.linguagens}');
  print('$p2 ama ${p2.linguagens}');
}


================================================
FILE: code/pt_Br/08_capitulo/07_construtor_const/main.dart
================================================
class LinguagemProgramacao {
  const LinguagemProgramacao(this.nome);

  final String nome;
}

void main() {
  final primeira = const LinguagemProgramacao('Dart');
  final segunda = const LinguagemProgramacao('Dart');
  final terceira = LinguagemProgramacao('Dart');
  print(identical(primeira, segunda)); // > true
  print(identical(primeira, terceira)); // > false
}


================================================
FILE: code/pt_Br/08_capitulo/08_construtor_factory/main.dart
================================================
class Programador {
  Programador._internal(this.nome);

  factory Programador(String nome) {
    if (_cache.containsKey(nome)) {
      return _cache[nome]!;
    }
    final novo = Programador._internal(nome);
    _cache[nome] = novo;
    return novo;
  }

  static final Map<String, Programador> _cache = {};
  String nome;

  static imprimirCache() {
    print(_cache);
  }
}

void main() {
  final p1 = Programador('Julio Bitencourt');
  final p2 = Programador('Julio Bitencourt');
  print(identical(p1, p2)); // > true
  Programador.imprimirCache();
  // > {Julio Bitencourt: Instance of 'Programador'}
}


================================================
FILE: code/pt_Br/08_capitulo/09_encapsulamento/main.dart
================================================
// class Programador {
//   DateTime? nascimento;
// }
//
// void main() {
//   final p1 = Programador();
//   p1.nascimento = DateTime(1995, 12, 1, 2, 30);
//   print(p1.nascimento); // > 1995-12-01 02:30:00.000
// }

class Programador {
  DateTime? _nascimento;

  set nascimento(DateTime? value) {
    if (value != null)
      _nascimento = DateTime(value.year, value.month, value.day);
  }

  DateTime? get nascimento => _nascimento;

  int get idade {
    if (_nascimento == null) return 0;
    return DateTime.now().difference(_nascimento!).inDays ~/ 365;
  }
}

void main() {
  final p1 = Programador();
  p1.nascimento = DateTime(1995, 12, 1, 2, 30);
  print(p1.nascimento); // > 1995-12-01 00:00:00.000
  print(p1.idade); // > 26
}


================================================
FILE: code/pt_Br/08_capitulo/10_heranca/main.dart
================================================
class Funcionario {
  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];

  void trabalhar() {
    print('${this.runtimeType} trabalhando..');
  }
}

class Programador extends Funcionario {
  List<String>? linguagens;
}

class Gerente extends Funcionario {
  double? bonus;
}

void main() {
  final programador = Programador()
    ..nome = 'Bill Gates'
    ..linguagens = ['.Net'];
  final gerente = Gerente()
    ..nome = 'Jeff Bezos'
    ..bonus = 500;
  programador.trabalhar(); // > Programador trabalhando..
  print('Programador é Funcionario? ${programador is Funcionario}');
  // > Programador é Funcionario? true
  gerente.trabalhar(); // > Gerente trabalhando..
  print('Gerente é Funcionario? ${gerente is Funcionario}');
  // > Gerente é Funcionario? true
}


================================================
FILE: code/pt_Br/08_capitulo/11_polimorfismo/main.dart
================================================
class Funcionario {
  void trabalhar() {
    print('Funcionario trabalhando..');
  }
}

class Programador extends Funcionario {
  @override
  void trabalhar() {
    print('Programador trabalhando..');
  }
}

class Gerente extends Funcionario {
  @override
  void trabalhar() {
    print('Gerente trabalhando..');
    super.trabalhar();
  }
}

class Startup {
  Startup(this.funcionarios);

  List<Funcionario> funcionarios;

  void novoProjeto() {
    funcionarios.forEach((f) => f.trabalhar());
  }
}

void main() {
  Funcionario funcionario = Funcionario();
  Funcionario programador = Programador();
  Funcionario gerente = Gerente();
  final startup = Startup([funcionario, programador, gerente]);
  startup.novoProjeto();
}


================================================
FILE: code/pt_Br/08_capitulo/12_classes_abstratas/main.dart
================================================
abstract class Funcionario {
  String? nome;
  double salario = 0.0;
  List<String> tarefas = [];

  void trabalhar();
}

class Programador extends Funcionario {
  List<String>? linguagens;

  @override
  void trabalhar() {
    print('Programador trabalhando..');
  }
}

class Gerente extends Funcionario {
  double? bonus;

  @override
  void trabalhar() {
    print('Gerente trabalhando..');
  }
}

class Robo extends Funcionario {
  double? bateria;

  @override
  void trabalhar() {
    print('0100010110010110');
  }
}

class Assalariado {
  Assalariado(this.salario);

  double? salario;

  void receber() {}
}

class Startup {
  Startup(this.funcionarios);

  List<Funcionario> funcionarios;

  void novoProjeto() {
    funcionarios.forEach((f) => f.trabalhar());
  }
}

void main() {
  Funcionario programador = Programador();
  Funcionario gerente = Gerente();
  final startup = Startup([programador, gerente]);
  startup.novoProjeto();
}


================================================
FILE: code/pt_Br/08_capitulo/13_interfaces/main.dart
================================================
abstract class Assalariado {
  Assalariado(this.salario);

  double salario;

  void receber();
}

abstract class Funcionario {
  String? nome;
  List<String> tarefas = [];

  void trabalhar();
}

class Programador extends Funcionario implements Assalariado {
  Programador({this.salario = 1000});

  List<String>? linguagens;

  @override
  double salario;

  @override
  void trabalhar() {
    print('Programador trabalhando..');
  }

  @override
  void receber() {
    print('Programador recebendo $salario');
  }
}

class Gerente extends Funcionario implements Assalariado {
  Gerente({this.salario = 5000});

  double? bonus;

  @override
  double salario;

  @override
  void trabalhar() {
    print('Gerente trabalhando..');
  }

  @override
  void receber() {
    print('Gerente recebendo $salario');
  }
}

class Robo extends Funcionario {
  double? bateria;

  @override
  void trabalhar() {
    print('0100010110010110');
  }
}

class Startup {
  List<Funcionario> funcionarios;
  List<Assalariado> assalariados;

  Startup(this.funcionarios, this.assalariados);

  void pagarFuncionarios() {
    assalariados.forEach((a) => a.receber());
  }
}

void main() {
  Funcionario programador = Programador();
  Funcionario gerente = Gerente();
  Funcionario robo = Robo();
  final startup = Startup(
    [programador, gerente, robo],
    [(programador as Assalariado), (gerente as Assalariado)],
  );
  startup.pagarFuncionarios();
}


================================================
FILE: code/pt_Br/08_capitulo/14_mixins/main.dart
================================================
mixin Assalariado on Funcionario {
  double salario = 0;

  void receber() {
    print('Pegando o salário do ${super.nome}, valor de $salario');
  }
}

abstract class Funcionario {
  String? nome;
  List<String> tarefas = [];

  void trabalhar();
}

class Programador extends Funcionario with Assalariado {
  List<String>? linguagens;

  void trabalhar() {
    print('Programador trabalhando..');
  }
}

class Gerente extends Funcionario with Assalariado {
  double? bonus;

  @override
  void trabalhar() {
    print('Gerente trabalhando..');
  }
}

class Robo extends Funcionario {
  double? bateria;

  @override
  void trabalhar() {
    print('0100010110010110');
  }
}

class Startup {
  List<Funcionario> funcionarios;
  List<Assalariado> assalariados;

  Startup(this.funcionarios, this.assalariados);

  void pagarFuncionarios() {
    assalariados.forEach((a) => a.receber());
  }
}

void main() {
  Funcionario programador = Programador()
    ..nome = 'Bill Gates'
    ..salario = 34000;
  Funcionario gerente = Gerente()
    ..nome = 'Douglas Adams'
    ..salario = 42000;
  Funcionario robo = Robo();
  final startup = Startup(
    [programador, gerente, robo],
    [(programador as Assalariado), (gerente as Assalariado)],
  );
  startup.pagarFuncionarios();
}


================================================
FILE: code/pt_Br/08_capitulo/15_mixins_a_fundo/main.dart
================================================
abstract class A {
  String ola();
}

mixin B {
  String ola() => 'Olá B';
}

mixin C {
  String ola() => 'Olá C';
}

class D extends A with B, C {
  void dizerOla() {
    print(ola());
  }
}

void main() {
  D().dizerOla();
}


================================================
FILE: code/pt_Br/08_capitulo/16_extension_methods/main.dart
================================================
String capitalizar(String texto) {
  if (texto.isEmpty) return texto;
  return '${texto[0].toUpperCase()}${texto.substring(1)}';
}

extension on String {
  String capitalizar() =>
      this.isEmpty ? this : '${this[0].toUpperCase()}${this.substring(1)}';

  String operator &(String other) => '$this - $other';

  String get primeiraPalavra => split(' ').first;

  String get ultimaPalavra => split(' ').last;
}

void main() {
  print(capitalizar('dart')); // > Dart
  print('julio'.capitalizar()); // > Julio
  print('julio bitencourt'.primeiraPalavra); // > julio
  print('julio bitencourt'.ultimaPalavra.capitalizar());
  // > Bitencourt
  print('julio' & 'bitencourt'); // > julio - bitencourt
}


================================================
FILE: code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/main.dart
================================================
import 'strings_extension.dart';

String capitalizar(String texto) {
  if (texto.isEmpty) return texto;
  return '${texto[0].toUpperCase()}${texto.substring(1)}';
}

void main() {
  print(capitalizar('dart')); // > Dart
  print('julio'.capitalizar()); // > Julio
  print('julio bitencourt'.primeiraPalavra); // > julio
  print('julio bitencourt'.ultimaPalavra.capitalizar());
  // > Bitencourt
  print('julio' & 'bitencourt'); // > julio - bitencourt
}


================================================
FILE: code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/strings_extension.dart
================================================
extension StringExtension on String {
  String capitalizar() =>
      this.isEmpty ? this : '${this[0].toUpperCase()}${this.substring(1)}';

  String operator &(String other) => '$this - $other';

  String get primeiraPalavra => split(' ').first;

  String get ultimaPalavra => split(' ').last;
}

================================================
FILE: code/pt_Br/08_capitulo/18_classe_wrapper/main.dart
================================================
class Id {
  Id(this._valor);
  final int _valor;
  
  bool get isValid => _valor > 0;
  Id get next => Id(_valor +1);

  @override
  String toString() => '$_valor';
}

class Funcionario {
  Funcionario(this.id);
  final Id id;
}

void main() {
  final id = Funcionario(Id(1)).id;
  // print(id + 1); // Erro de compilação
  print(id.next.next); // > 3
  print(id.runtimeType); // > Id
}

================================================
FILE: code/pt_Br/08_capitulo/19_extension_types/main.dart
================================================
import 'package:meta/meta.dart';

extension type Id(int id) {
  Id get next => Id(id + 1);
  bool get isValid => id > 0;
}

class Funcionario {
  Funcionario(this.id);
  final Id id;
}

void main() {
  final id = Funcionario(Id(1)).id;
  // print(id + 1); // Erro de compilação
  print(id.next.next); // > 3
  print(id.runtimeType); // > int

  int idInt = id as int;
  print(idInt + idInt); // > 2
  if(id case int n) print('${n+n}'); // > 2
}

extension type MinhaString(String _) implements String {
  @redeclare
  int operator [](int index) => codeUnitAt(index);
}

================================================
FILE: code/pt_Br/08_capitulo/19_extension_types/pubspec.yaml
================================================
name: extensions
description: A starting point for Dart libraries or applications.
version: 1.0.0
# repository: https://github.com/my_org/my_repo

environment:
  sdk: ^3.5.1

# Add regular dependencies here.
dependencies:
  meta: ^1.16.0

dev_dependencies:
  lints: ^4.0.0
  test: ^1.24.0


================================================
FILE: code/pt_Br/08_capitulo/20_modifiers_abstract/main.dart
================================================
abstract class A {}
class B extends A {}
class C implements A {}

// Modificador abstract desabilita o instanciamento
final a = A(); // Erro

================================================
FILE: code/pt_Br/08_capitulo/21_modifiers_interface/arquivo.dart
================================================
interface class A {}

================================================
FILE: code/pt_Br/08_capitulo/21_modifiers_interface/main.dart
================================================
import 'arquivo.dart';

// Modificador interface desabilita a herança:
class B extends A {} // Erro

class C implements A {}
final a = A();

================================================
FILE: code/pt_Br/08_capitulo/22_modifiers_base/arquivo.dart
================================================
base class A {}

================================================
FILE: code/pt_Br/08_capitulo/22_modifiers_base/main.dart
================================================
import 'arquivo.dart';


base class B extends A {}
final a = A();

// Modificador base desabilita o implements
base class C implements A {} // Erro

================================================
FILE: code/pt_Br/08_capitulo/23_modifiers_final/arquivo.dart
================================================
final class A {}

================================================
FILE: code/pt_Br/08_capitulo/23_modifiers_final/main.dart
================================================
import 'arquivo.dart';

//Modificador final desabilita subclasses e subtipos:
class B extends A {} // Erro
class C implements A {} // Erro

final a = A();

================================================
FILE: code/pt_Br/08_capitulo/24_modifiers_sealed/main.dart
================================================
sealed class Poligono {}
class Pentagono extends Poligono {}
sealed class Triangulo extends Poligono {}
class Isoceles extends Triangulo {}
class Equilatero extends Triangulo {}
sealed class Quadrilatero extends Poligono {}
class Retangulo extends Quadrilatero {}

int ladosPoligono(Poligono p) => switch (p) {
  Isoceles() || Equilatero() => 3,
  Retangulo() => 4,
  Pentagono() => 5,
};

================================================
FILE: code/pt_Br/09_capitulo/01_generics_1/main.dart
================================================
abstract class VeiculoAutomotor {}

class Carro extends VeiculoAutomotor {}

class Caminhao extends VeiculoAutomotor {}

class FilaPedagio {
  List _veiculos = [];

  void entrarNaFila(veiculo) {
    _veiculos.add(veiculo);
  }
}

void main() {
  final fila = FilaPedagio();
  fila.entrarNaFila(Carro());

  /// Caminhão não deveria entrar na mesma fila que um carro
  fila.entrarNaFila(Caminhao());
}


================================================
FILE: code/pt_Br/09_capitulo/02_generics_2/main.dart
================================================
abstract class VeiculoAutomotor {}

class Carro extends VeiculoAutomotor {}

class Caminhao extends VeiculoAutomotor {}

class FilaPedagioCarro {
  List _veiculos = [];

  void entrarNaFila(Carro veiculo) {
    _veiculos.add(veiculo);
  }
}

class FilaPedagioCaminhao {
  List _veiculos = [];

  void entrarNaFila(Caminhao veiculo) {
    _veiculos.add(veiculo);
  }
}

/// Criar duas filas separadas é uma alternativa, mas não é
/// um bom design de código, pois estamos duplicando código.
void main() {
  var filaCarro = FilaPedagioCarro();
  filaCarro.entrarNaFila(Carro());
  var filaCaminhao = FilaPedagioCaminhao();
  filaCaminhao.entrarNaFila(Caminhao());
}


================================================
FILE: code/pt_Br/09_capitulo/03_generics_3/main.dart
================================================
abstract class VeiculoAutomotor {}

class Carro extends VeiculoAutomotor {}

class Caminhao extends VeiculoAutomotor {}

class FilaPedagio<T> {
  List<T> _veiculos = [];

  void entrarNaFila(T veiculo) {
    _veiculos.add(veiculo);
  }
}

/// Tipando FilaPedagio<T> com generics ganhamos a liberdade de criar
/// filas especialistas em um determinado tipo.
/// Como filas só de carros ou caminhões.
void main() {
  final filaCarro = FilaPedagio<Carro>();
  filaCarro.entrarNaFila(Carro());
  // filaCarro.entrarNaFila(Caminhao()); // Erro
  final filaCaminhao = FilaPedagio<Caminhao>();
  filaCaminhao.entrarNaFila(Caminhao());
}


================================================
FILE: code/pt_Br/09_capitulo/04_generics_restringindo_tipo/main.dart
================================================
abstract class VeiculoAutomotor {}

class Carro extends VeiculoAutomotor {}

class Caminhao extends VeiculoAutomotor {}

class FilaPedagio<T extends VeiculoAutomotor> {
  List<T> _veiculos = [];

  void entrarNaFila(T veiculo) {
    _veiculos.add(veiculo);
  }
}

class Bicicleta {}

/// Restringindo os tipos aceitos em FilaPedagio<T> para apenas subclasses de
/// VeiculoAutomotor, estamos impedindo que veículos como Bicicleta entrem na
/// fila de pedágio.
void main() {
  final filaCarro = FilaPedagio<Carro>();
  final filaCaminhao = FilaPedagio<Caminhao>();
  // final filaBicicleta = FilaPedagio<Bicicleta>(); //Erro
}


================================================
FILE: code/pt_Br/09_capitulo/05_generics_metodos/main.dart
================================================
T ultimo<T extends num>(List<T> itens) {
  T ultimo = itens.last;
  return ultimo;
}

void main() {
  print(ultimo<int>([10, 20, 30])); // > 30
  print(ultimo([1.4, 2, 42.0])); // > 42.0
}


================================================
FILE: code/pt_Br/09_capitulo/06_lists/main.dart
================================================
void main() {
  final vogais = [];
  vogais.add('a');
  vogais.add(42);
  print(vogais);
  print(vogais.runtimeType);

  print('---------------');

  final risadas = <String>[];
  risadas.addAll(['kkk', 'haha', 'rsrs']);
  print(risadas);
  print(risadas.runtimeType);

  print('---------------');

  final alfabeto = ['a', 'b'];
  alfabeto.add('c');
  print(alfabeto);
  print(alfabeto.runtimeType);

  print('---------------');

  /// Lista de tamanho fixo:
  final vogaisFixo = List<String>.filled(5, 'e');
  vogaisFixo[0] = 'a';
  vogaisFixo[4] = 'u';
  // vogaisFixo.add('a'); // Erro
  print(vogaisFixo);
}


================================================
FILE: code/pt_Br/09_capitulo/07_iterando_lists/main.dart
================================================
void main() {
  final risadas = <String>['kkk', 'haha', 'rsrs'];

  /// Primeira forma de varrer uma lista:
  /// Para quando o índice é importante.
  for (var i = 0; i < risadas.length; i++) print(risadas[i]);

  print('---------------');

  /// Segunda forma de varrer uma lista:
  /// Para quando o índice não importa.
  for (final r in risadas) print(r);

  print('---------------');

  /// Terceira forma de varrer uma lista:
  /// Uma forma funcional
  risadas.forEach((r) => print(r));

  print('---------------');

  /// Quarta forma de varrer uma lista:
  /// Uma forma hardcore. Utilizando a interface Iterator para controle
  /// do ponteiro que varre a lista.
  Iterator i = risadas.iterator;
  while (i.moveNext()) print(i.current);
}


================================================
FILE: code/pt_Br/09_capitulo/08_linked_hash_set/main.dart
================================================
import 'dart:collection';

/// Todo Set por padrão implementa um LinkedHashSet,
/// que mantém a ordem dos elementos inseridos.
void main() {
  final megasena = Set<int>();
  megasena.addAll([44, 35, 4, 11, 29, 4, 35, 57]);
  print(megasena); // > {44, 35, 4, 11, 29, 57}

  final vogais = <String>{'a', 'e', 'i', 'a', 'o', 'u'};
  print(vogais); // > {a, e, i, o, u}
  print(vogais.elementAt(1)); // e
  // print(vogais[0]); // Erro

  final consoantes = LinkedHashSet();
  consoantes.addAll(['b', 'c', 'd']);
  print(consoantes); // > {b, c, d}
}


================================================
FILE: code/pt_Br/09_capitulo/09_hash_set/main.dart
================================================
import 'dart:collection';

/// A implementação do HashSet não mantém a ordem de inserção.
/// A ordem dos elementos é de acordo com a implementação do hashCode.
void main() {
  final megasena = HashSet<int?>();
  megasena.addAll([44, 35, 4, 11, null, 29, 4, null, 35, 57]);
  print(megasena); // > {35, 4, 57, 11, null, 44, 29}
}


================================================
FILE: code/pt_Br/09_capitulo/10_splay_tree_set/main.dart
================================================
import 'dart:collection';

/// A implementação do SplayTreeSet também não mantém a ordem de inserção.
/// A ordem dos elementos é de acordo com a implementação do compareTo de [Comparable].
void main() {
  final vogais = ['e', 'i', 'a', 'o', 'u'];
  vogais.sort();
  print(vogais); // > [a, e, i, o, u]

  final megasena = SplayTreeSet<String>();
  megasena.addAll(['44', '35', '4', '11', '4']);
  print(megasena); // > {11, 35, 4, 44}

  final megasena2 = SplayTreeSet<String>((a, b) {
    return int.parse(a).compareTo(int.parse(b));
  });
  megasena2.addAll(['44', '35', '4', '11', '4']);
  print(megasena2); // > {4, 11, 35, 44}
}


================================================
FILE: code/pt_Br/09_capitulo/11_queue/main.dart
================================================
import 'dart:collection';

void main() {
  final megasena = Queue<int>();
  megasena.addAll([11, 35]);
  print(megasena);
  megasena.addFirst(4); // > {4, 11, 35}
  print(megasena);
  megasena.removeLast(); // > {4, 11}
  print(megasena);
  megasena.addLast(44); // > {4, 11, 44}
  print(megasena);
  megasena.removeFirst(); // > {11, 44}
  print(megasena);
}


================================================
FILE: code/pt_Br/09_capitulo/12_map/main.dart
================================================
import 'dart:collection';

void main() {
  final clientes = Map<int, String>();
  clientes[1] = 'Rafael';
  clientes[1] = 'Juliana';
  clientes.putIfAbsent(2, () => 'João');
  clientes.putIfAbsent(2, () => 'Maria');
  print(clientes); // {1: Juliana, 2: João}
  final usuario = {
    'Nome': 'Julio',
    'Linguagens': ['dart', 'java']
  };
  usuario.putIfAbsent('Github', () => 'JHBitencourt');
  print(usuario.runtimeType); // > _InternalLinkedHashMap<String, Object>

  print(usuario['Nome']!.runtimeType); // > String
  print(usuario['Sobrenome']?.runtimeType); // > null

  Iterable chaves = clientes.keys;
  Iterable valores = clientes.values;
  Iterable<MapEntry> elementos = clientes.entries;
  print(elementos.first.key); // > 1
  print(elementos.first.value); // > Juliana

  final linkedHashMap = LinkedHashMap.fromIterables(['3', '1', '2'], [1, 2, 3]);
  print(linkedHashMap); // > {3: 1, 1: 2, 2: 3}

  final hashMap = HashMap.fromIterables(['3', '1', '2'], [1, 2, 3]);
  print(hashMap); // > {1: 2, 3: 1, 2: 3}

  final splayTreeMap = SplayTreeMap<String, int>.fromIterables(
      ['3', '1', '2'], [1, 2, 3], (a, b) {
    return int.parse(a).compareTo(int.parse(b));
  });
  print(splayTreeMap); // > {1: 2, 2: 3, 3: 1}
}


================================================
FILE: code/pt_Br/09_capitulo/13_records/main.dart
================================================
void main() {
  var turing = ('Alan Turing', 41, 1954);
  var hawking = ('Stephen Hawking',);
  var lovelace = ('Ada Lovelace', idade: 36, falecimento: 1852);
  
  print(hawking.runtimeType); // > (String)
  print(turing.runtimeType); // > (String, int, int)
  print(turing.$1); // > Alan Turing
  print(turing.$3); // > 1954
  print(lovelace.idade); // > 36
}

================================================
FILE: code/pt_Br/09_capitulo/14_records_tipados/main.dart
================================================
void main() {
  (String, int, int) turing = ('Alan Turing', 41, 1954);
  (String nome,) hawking = ('Stephen Hawking',);
  (String nome, {int idade, int falecimento}) lovelace; 
  lovelace = ('Ada Lovelace', idade: 36, falecimento: 1852);
  print(lovelace.runtimeType); // > (String, {int falecimento, int idade})
}

================================================
FILE: code/pt_Br/09_capitulo/15_records_equalidade/main.dart
================================================
void main() {
  (int x, int y, int z) coordenada1 = (10, 3, 4);
  (int r, int g, int b) cor1 = (10, 3, 4);
  print(coordenada1 == cor1); // > true

  ({int x, int y, int z}) coordenada2 = (x: 10, y: 3, z: 4);
  ({int r, int g, int b}) cor2 = (r: 10, g: 3, b: 4);
  print(coordenada2 == cor2); // > false
}

================================================
FILE: code/pt_Br/09_capitulo/16_records_retorno_funcao/main.dart
================================================
void main() {
  var comprovante = comprovanteTransacao();
  print(comprovante.$1); // > chavepix@gmail.com

  var (chaveDestino, _, hora: data) = comprovanteTransacao();
  print(chaveDestino); // > chavepix@gmail.com
  print(data); // > 2024-11-19 21:24:02.623
}

typedef Comprovante = (String chave, double valor, {DateTime hora});
Comprovante comprovanteTransacao() {
  return ('chavepix@gmail.com', 29.9, hora: DateTime.now());
}

// (String, double, DateTime) comprovanteTransacao() {
//   return ('chavepix@gmail.com', 29.9, DateTime.now());
// }

================================================
FILE: code/pt_Br/09_capitulo/17_pattern_matching/main.dart
================================================
void main() {
  var list = [1, 2, 3, 4];
  var [primeiro, ..., ultimo] = list;
  print('$primeiro - $ultimo'); // > 1 - 4

  var (a, b) = ('esquerda', 'direita');
  (a, b) = (b, a);
  print('$a - $b'); // > direita - esquerda

  var coordenada = (4, 2);
  if(coordenada case (var x, var y) when x > 0 && y > 0) {
    print('Coordenadas positivas $x-$y!'); // > Coordenadas positivas 4-2!
  }
  
  switch (coordenada) {
    case (var x, var y) when x > 0 && y > 0:
      print('1° quadrante do plano cartesiano!'); // > 1° quadrante do plano cartesiano!
    case (var x, var y) when x < 0 && y < 0:
      print('3° quadrante do plano cartesiano!');
  }

  var cliente = Cliente(id: 42, apelido: 'Bob', idade: 28);
  var Cliente(:id, apelido: nickname) = cliente;
  print('Cliente $id é o $nickname'); // > Cliente 42 é o Bob
}

class Cliente {
  final int id;
  final String apelido;
  final int? idade;

  Cliente({required this.id, required this.apelido, this.idade});
}


================================================
FILE: code/pt_Br/09_capitulo/18_pattern_destructuring/main.dart
================================================
void main() {
  final resposta = 42;
  switch (resposta) {
    case 42:
      print('sentido da vida, do universo e tudo mais!');
  }

  final pares = [2, 4, 6, 8];
  switch (pares) {
    case [2, _, 4, 5]:
      print('Segundo valor não importa');
    case [2 || 4, ...]:
      print('Começa com 2 ou 4!'); // > Começa com 2 ou 4!
    default:
      print('Sem matching.');
  }
}



================================================
FILE: code/pt_Br/09_capitulo/19_pattern_for_looping/main.dart
================================================
void main() {
  var clientes = {1:'Bob', 2:'Ana'};
  for(var MapEntry(:key, value: nome) in clientes.entries) {
    print('Cliente $key chama-se $nome');
  }
}

================================================
FILE: code/pt_Br/09_capitulo/20_pattern_collection_literal/main.dart
================================================
void main() {
  var numeros = [-3, 4, 6, 1, -9, -4];
  var positivos = [for (var n in numeros) if (n case > 0) n];
  print(positivos); // > [4, 6, 1]
}

================================================
FILE: code/pt_Br/10_capitulo/01_event_loop/main.dart
================================================
import 'dart:async';
void main () {
  print('Início main()');
  Timer.run(() => print('Event loop 1')); // #E1
  Timer.run(() { // #E2
    scheduleMicrotask(() => print('Microtask 3')); // #M3
    print('Event loop 2');
  });
  scheduleMicrotask(() => print('Microtask 1')); // #M1
  Timer.run(() => print('Event loop 3')); // #E3
  scheduleMicrotask(() => print('Microtask 2')); // #M2
  print('Fim main()');
}

================================================
FILE: code/pt_Br/10_capitulo/02_programa_sincrono_1/main.dart
================================================
void main () {
  print('Início main()');
  int index = 0;
  while(index < 10) {
    print('Índice $index');
    index++;
  }
  print('Fim main()');
}

================================================
FILE: code/pt_Br/10_capitulo/03_programa_sincrono_2/main.dart
================================================
import 'dart:io';

void main() {
  print(temperaturaAtual());
  print(previsaoAmanha());
}

String temperaturaAtual() {
  sleep(const Duration(seconds: 3));
  return 'Está fazendo 28º';
}

String previsaoAmanha() {
  sleep(const Duration(seconds: 4));
  return 'Amanhã fará 35º';
}

================================================
FILE: code/pt_Br/10_capitulo/04_future/main.dart
================================================
void main() {
  final future = Future<int>(() {
    return 84 ~/ 2;
  }).then((int valor) {
    print('Future em estado Completo, valor: $valor');
  }).catchError((Object erro, StackTrace stacktrace) {
    print('Future em estado Completo, erro: $erro');
    print(stacktrace);
  }).whenComplete(() {
    print('Future finalizado');
  });
  print('$future em estado Incompleto');
}

================================================
FILE: code/pt_Br/10_capitulo/05_future_encadeado/main.dart
================================================
void main() {
  buscarId().then((int id) {
    print('Id encontrado, buscando nome..');
    return buscarNome(id);
  }).then(print);
  print('Buscando..');
}

Future<int> buscarId() {
  return Future.delayed(const Duration(seconds: 3), () => 1);
}

Future<String> buscarNome(int id) {
  return Future.delayed(const Duration(seconds: 3), () => 'JHBitencourt');
}


================================================
FILE: code/pt_Br/10_capitulo/06_erro_cadeia_assincrona/main.dart
================================================
Future<String> um() => Future.value('Primeiro');
Future<String> dois() => Future.error('Erro no dois()');
Future<String> tres() => Future.value('Terceiro');

void main() {
  um().then((_) => dois())
      .then((_) => tres())
      .then((String valor) {
    print('O valor é $valor');
  });
}

================================================
FILE: code/pt_Br/10_capitulo/07_erro_cadeia_try_catch/main.dart
================================================
Future<String> um() => Future.value('Primeiro');

Future<String> dois() => Future.error('Erro no dois()');

Future<String> tres() => Future.value('Terceiro');

void main() {
  try {
    um().then((_) => dois())
        .then((_) => tres())
        .then((String valor) {
      print('O valor é $valor');
    });
  } catch(e) {
    print('Capturado: $e');
  }
}

================================================
FILE: code/pt_Br/10_capitulo/08_erro_cadeia_catch_error/main.dart
================================================
Future<String> um() => Future.value('Primeiro');

Future<String> dois() => Future.error('Erro no dois()');

Future<String> tres() => Future.value('Terceiro');

void main() {
  um().then((_) => dois())
      .then((_) => tres())
      .catchError((dynamic e) {
    print('Capturado: $e');
    return '42';
  }).then((String valor) {
    print('O valor é $valor');
  });
}

================================================
FILE: code/pt_Br/10_capitulo/09_erro_cadeia_on_error/main.dart
================================================
Future<String> um() => Future.value('Primeiro');

Future<String> dois() => Future.error('Erro no dois()');

Future<String> tres() => Future.value('Terceiro');

void main() {
  um().then((_) => dois())
      .then((_) => tres(), onError: (dynamic e) {
    print('Capturado onError: $e');
    return '42 :)';
  }).catchError((dynamic e) {
    print('Capturado: $e');
    return '42';
  }).then((String valor) {
    print('O valor é $valor');
  });
}

================================================
FILE: code/pt_Br/10_capitulo/10_future_sync/main.dart
================================================
void main() {
  Future<String>.sync(() {
    print('Função Future.sync() executada');
    return 'Future síncrono?';
  }).then(print);
  print('Future.sync():');
}


================================================
FILE: code/pt_Br/10_capitulo/11_future_microtask/main.dart
================================================
void main() {
  Future(() => 'Future normal').then(print);
  Future.microtask(() => 'Future microtask').then(print);
}


================================================
FILE: code/pt_Br/10_capitulo/12_future_value/main.dart
================================================
void main() {
  Future<int>(() => Future.value(42)).then(print);
  print('Future.value():');
}


================================================
FILE: code/pt_Br/10_capitulo/13_future_error/main.dart
================================================
void main() {
  Future.error('ERRO')
      .then(
        (valor) => print('Não executa, o Future completa com erro..'),
        onError: (e) => print('Erro capturado no onError $e'),
      )
      .catchError((e) => print('Future.error() => $e'));
}


================================================
FILE: code/pt_Br/10_capitulo/14_future_wait/main.dart
================================================
void main() {
  Future.wait<String>(listaFuture()).then(print, onError: print);
  print('Aguardando..');
}

List<Future<String>> listaFuture() => <int>[2, 1, 3]
    .map((s) => Future<String>.delayed(Duration(seconds: s), () => 'Tempo: $s'))
    .toList();

Future<String> comErro() => Future<String>.error('Erro ao buscar dados.');


================================================
FILE: code/pt_Br/10_capitulo/15_future_any/main.dart
================================================
void main() {
  Future.any<String>(listaFuture()).then(print, onError: print);
  print('Aguardando..');
}

List<Future<String>> listaFuture() => <int>[2, 1, 5]
    .map((s) => Future<String>.delayed(Duration(seconds: s), () => 'Tempo: $s'))
    .toList();

Future<String> comErro() => Future<String>.error('Erro ao buscardados.');


================================================
FILE: code/pt_Br/10_capitulo/16_async_await/main.dart
================================================
void main() {
  final r = resposta().then(print);
  print('Resposta: $r');
}

resposta() async {
  return 42;
}


================================================
FILE: code/pt_Br/10_capitulo/17_async_await_fluxo/main.dart
================================================
void main() {
  final future = resposta();
  future.then(print);
  print('Resposta: $future');
}

Future<int> resposta() async {
  print('Isso é síncrono');
  final r = await 42;
  print('Isso é após o await');
  return r;
}


================================================
FILE: code/pt_Br/10_capitulo/18_async_await_x_future/main.dart
================================================
Future<String> buscarNomeUsuario() {
  return buscarId().then((int id) {
    return buscarNome(id);
  }).then((String nome) {
    return 'Usuário: $nome';
  });
}

Future<String> buscarNomeUsuarioAsync() async {
  final id = await buscarId();
  final nome = await buscarNome(id);
  return 'Usuário: $nome';
}

main() async {
  final usuario = await buscarNomeUsuario();
  print('$usuario');

  final usuarioAsync = await buscarNomeUsuarioAsync();
  print('$usuarioAsync');
}

Future<int> buscarId() async => 42;

Future<String> buscarNome(int id) async => 'JHBitencourt';


================================================
FILE: code/pt_Br/10_capitulo/19_async_await_erro/main.dart
================================================
void main() {
  buscarId();
  print('Capturando um erro assíncrono...');
}

Future<int> buscarId() async {
  try {
    return await Future<int>(() {
      return 42 ~/ 0;
    });
  } on UnsupportedError catch (e) {
    print('Erro capturado: $e');
  } catch (e) {
    print('Demais erros caem aqui');
  }
  return 0;
}

// Future<int> buscarId() async {
//   return Future<int>(() {
//     return 42 ~/ 0;
//   }).catchError((dynamic e) {
//     print('Erro capturado: $e');
//     return 0;
//   }, test: (dynamic e) => e is UnsupportedError)
//       .catchError(
//         (dynamic e) {
//       print('Demais erros caem aqui');
//       return 0;
//     },
//   );
// }


================================================
FILE: code/pt_Br/10_capitulo/20_completer_future/main.dart
================================================
import 'dart:async';

class Database {
  void salvarUsuario(String usuario, void Function(String) callback) {
    Timer(Duration(seconds: 2), () {
      callback('$usuario salvo');
    });
  }
}

class FutureDatabase {
  Future<String> salvarUsuario(String usuario) {
    final completer = Completer<String>();
    Database().salvarUsuario(usuario, (String resultado) {
      completer.complete(resultado);
    });
    return completer.future;
  }
}

Future<void> main() async {
  // Database().salvarUsuario('JHBitencourt', callbackUsuario);
  final resultado = await FutureDatabase().salvarUsuario('JHBitencourt');
  print('Resultado: $resultado');
}

void callbackUsuario(String resultado) {
  print('Callback executado: $resultado');
}


================================================
FILE: code/pt_Br/10_capitulo/21_completer_flexibilidade/main.dart
================================================
import 'dart:async';
import 'dart:math';

class CompletoComNumero {
  late Completer<String> _completer;
  int numero;

  CompletoComNumero._internal(this.numero) {
    _completer = Completer();
    sorteio().listen(_validarNumero);
  }

  Stream<int> sorteio() async* {
    for (int i = 0; i < 5; i++) {
      if (_completer.isCompleted) break;

      await Future<void>.delayed(Duration(seconds: 1));
      final sorteado = Random().nextInt(5) + 1;
      print('Sorteio: $sorteado');

      yield sorteado;
    }
    if (!_completer.isCompleted) {
      _completer.completeError('O número não foi sorteado!');
    }
  }

  void _validarNumero(int numeroSorteado) {
    if (numeroSorteado == numero) {
      _completer.complete('O número $numero foi sorteado!');
    }
  }

  static Future<String> novo(int numero) async {
    final c = CompletoComNumero._internal(numero);
    return c._completer.future;
  }
}

void main() {
  CompletoComNumero.novo(3).then(print).catchError(print);
}

================================================
FILE: code/pt_Br/11_capitulo/01_dart_args/main.dart
================================================
/// Rode o programa com o código:
/// dart main.dart teste1 2 3
void main(List<String> args) {
  print(args);
}

================================================
FILE: code/pt_Br/11_capitulo/02_dart_http/main.dart
================================================
import 'package:http/http.dart' as http;
void main(List<String> args) async {
  http.Response response = await http.get(Uri.parse('https://google.com'));
  print(response.body);
}

================================================
FILE: code/pt_Br/11_capitulo/02_dart_http/pubspec.yaml
================================================
name: livro_dart
description: Dart http.

environment:
  sdk: '>=2.16.0 <3.0.0'

dependencies:
  http: ^0.13.4

================================================
FILE: code/pt_Br/11_capitulo/03_dart_convert/main.dart
================================================
import 'dart:convert';

void main() {
  final dados =
      '{"data":[{ "id":1, "name":"Acre" }, { "id":2, "name":"Alagoas" }]}';
  Map<String, dynamic> map = json.decode(dados);
  print(map);
}


================================================
FILE: code/pt_Br/12_capitulo/01_stream_subscription/main.dart
================================================
import 'dart:async';

void main() {
  print('Início main()');
  final stream = Stream<String>.value('A');
  StreamSubscription subscription = stream.listen((dado) {
    print('Novo evento: $dado');
  });
  print('Fim main()');
}


================================================
FILE: code/pt_Br/12_capitulo/02_stream_subscription_varios_dados/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'E', 'I']);
  final subscription = stream.listen(null);
  subscription.onData((dado) {
    print('Novo evento: $dado');
  });
}


================================================
FILE: code/pt_Br/12_capitulo/03_stream_subscription_callbacks/main.dart
================================================
void main() {
  final stream = Stream.error('StreamErro');
  final subscription = stream.listen((dado) {
    print('Novo evento: $dado');
  });
  subscription.onError((e) {
    print('Erro capturado: $e');
  });
  subscription.onDone(() => print('Stream finalizada'));
}


================================================
FILE: code/pt_Br/12_capitulo/04_inscricao_unica_listener/main.dart
================================================
void main() async {
  final stream = Stream.value('42');
  final inscricaoUm = stream.listen(print);
  /// Erro! Só é possível 1 listener em streams de inscrição única.
  final inscricaoDois = stream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/05_broadcast_listener/main.dart
================================================
void main() async {
  final stream = Stream.value('42').asBroadcastStream();
  stream.listen((dado) => print('Inscrição 1 - $dado'));
  stream.listen((dado) => print('Inscrição 2 - $dado'));
}


================================================
FILE: code/pt_Br/12_capitulo/06_stream_controller/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  Stream stream = controller.stream;
}


================================================
FILE: code/pt_Br/12_capitulo/07_stream_controller_sink/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  final stream = controller.stream;

  final subscription = stream.listen((dado) {
    print('Novo evento: $dado');
  });
  subscription.onError((e) {
    print('Erro capturado: $e');
  });

  StreamSink sink = controller.sink;
  sink.add(42);
  sink.addError('Erro');
}


================================================
FILE: code/pt_Br/12_capitulo/08_stream_consumer/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  controller.stream.listen((dado) {
    print('Novo evento: $dado');
  });

  StreamSink sink = controller.sink;
  final future = sink.addStream(Stream.fromIterable(['A', 'B', 'C']));
  future.whenComplete(() => print('Todos eventos processados'));
}


================================================
FILE: code/pt_Br/12_capitulo/09_stream_consumer_2/main.dart
================================================
import 'dart:async';

void main() {
  final controllerUm = StreamController();
  controllerUm.stream.listen((dado) {
    print('Novo evento StreamUm: $dado');
  }, onDone: () => print('StreamUm finalizada'));

  final controllerDois = StreamController.broadcast();
  final future = controllerUm.sink.addStream(controllerDois.stream);
  future.whenComplete(() => print('Todos eventos processados'));

  controllerDois.stream.listen((dado) {
    print('Novo evento StreamDois: $dado');
  }, onDone: () => print('StreamDois finalizada'));
  controllerDois.sink.add(42);
}


================================================
FILE: code/pt_Br/12_capitulo/10_stream_sink_close/main.dart
================================================
import 'dart:async';

void main() {
  final controllerUm = StreamController();
  controllerUm.stream.listen((dado) {
    print('Novo evento StreamUm: $dado');
  }, onDone: () => print('StreamUm finalizada'));

  final controllerDois = StreamController.broadcast();
  final future = controllerUm.sink.addStream(controllerDois.stream);
  future.whenComplete(() {
    print('Todos eventos processados');
    controllerUm.sink.close();
  });

  controllerDois.stream.listen((dado) {
    print('Novo evento StreamDois: $dado');
  }, onDone: () => print('StreamDois finalizada'));
  controllerDois.sink.add(42);
  controllerDois.sink.close();
}


================================================
FILE: code/pt_Br/12_capitulo/11_stream_sink_x_stream_controller/main.dart
================================================
import 'dart:async';

void acessaSink(StreamSink sink) {
  sink.add(42);
  if (sink is StreamController) {
    sink.stream.listen(print);
  }
}

void main() {
  /// Sink encapsulada, impede o acesso direto ao controller:
  acessaSink(StreamController().sink);

  /// Controller também é um sink, mas fornece acesso a mais informações
  // acessaSink(StreamController());
}


================================================
FILE: code/pt_Br/12_capitulo/12_controller_callback_inscricao_unica/main.dart
================================================
import 'dart:async';

void dispararEventos(StreamController controller) async {
  for (var i = 1; i <= 6; i++) {
    if (i == 5) {
      controller.sink.addError('Erro no número $i');
      continue;
    }
    await Future.delayed(Duration(seconds: 1), () {
      controller.sink.add(i);
    });
  }
  controller.sink.close();
  print('StreamController em estado FECHADO');
}

void main() {
  StreamController<int>? controller;
  controller = StreamController<int>(
      onListen: () {
        print('StreamController em estado ATIVO');
        dispararEventos(controller!);
      },
      onResume: () => print('StreamController resumido'),
      onPause: () => print('StreamController pausado'),
      onCancel: () => print('StreamController em estado CANCELADO'),
      sync: false);
  controller.sink.add(0);

  print('StreamController em estado INICIAL');
  StreamSubscription? inscricao;
  Future.delayed(Duration(seconds: 2), () {
    inscricao = controller!.stream.listen((int dado) {
      print('Número: $dado');
      if (dado == 1) {
        print('Inscrição pausada');
        inscricao!.pause(Future.delayed(
            Duration(seconds: 1), () => print('Inscrição resumida')));
      }
    }, onError: (print), onDone: () => print('onDone'), cancelOnError: true);
  });
}


================================================
FILE: code/pt_Br/12_capitulo/13_controller_callback_broadcast/main.dart
================================================
import 'dart:async';

void dispararEventos(StreamController controller) async {
  for (var i = 1; i <= 6; i++) {
    if (i == 3) {
      controller.sink.addError('Erro no número $i');
      continue;
    }
    await Future.delayed(Duration(seconds: 1), () {
      controller.sink.add(i);
    });
  }
  controller.sink.close();
  print('StreamController em estado FECHADO');
}

void criarInscricao(StreamController<int> controller, int valor) {
  StreamSubscription? inscricao;
  Future.delayed(Duration(seconds: 2), () {
    inscricao = controller.stream.listen((int dado) {
      print('[Inscrição $valor] número: $dado');
      if (dado == valor) {
        print('[Inscrição $valor] pausada');
        inscricao!.pause(Future.delayed(Duration(seconds: 2),
                () => print('[Inscrição $valor] resumida')));
      }
      if (dado == valor + 3) {
        print('[Inscrição $valor] cancelada');
        inscricao!.cancel();
      }
    }, onError: (e) => print('[Inscrição $valor] $e'),
        onDone: () => print('[Inscrição $valor] onDone'), cancelOnError: false);
  });
}

void main() {
  StreamController<int>? controller;
  controller = StreamController<int>.broadcast(
      onListen: () {
        print('StreamController em estado ATIVO');
        dispararEventos(controller!);
      },
      onCancel: () =>
          print('StreamController em estado CANCELADO'
          ),
      sync: false);
  controller.sink.add(0);
  print('StreamController em estado INICIAL');
  criarInscricao(controller, 1);
  criarInscricao(controller, 2);
  Future.delayed(Duration(seconds: 8), () {
    criarInscricao(controller!, 3);
  });
}

================================================
FILE: code/pt_Br/12_capitulo/14_stream_await/main.dart
================================================
// void main() {
//   print('início main()');
//   final stream = Stream.fromIterable(['4', '2']);
//   stream.listen((dado) {
//     print('Novo evento: $dado');
//   });
//   print('fim main()');
// }

Future<void> main() async {
  print('início main()');
  final stream = Stream.fromIterable(['4', '2']);
  await for (var dado in stream) {
    print('Novo evento: $dado');
  }
  print('fim main()');
}


================================================
FILE: code/pt_Br/12_capitulo/15_stream_await_error/main.dart
================================================
void main() async {
  print('início main()');
  final stream = Stream.error(['Error']);
  try {
    await for (var dado in stream) {
      print('Novo evento: $dado');
    }
  } catch (e) {
    print('Erro capturado: $e');
  }
  print('fim main()');
}


================================================
FILE: code/pt_Br/12_capitulo/16_stream_await_sem_encerramento/main.dart
================================================
import 'dart:async';

void main() async {
  print('início main()');
  final controller = StreamController();
  controller.sink.add('42');
  await for (var dado in controller.stream) {
    print('Novo evento: $dado');
  }
  print('fim main()');
}


================================================
FILE: code/pt_Br/12_capitulo/17_stream_propriedades/main.dart
================================================
void main() {
  final stream =
      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();
  stream.first.then(print); // > AA
  stream.last.then(print); // > AU
  stream.isEmpty.then(print); // > false
  stream.length.then(print); // > 5
  print(stream.isBroadcast); // > true
  stream.single.catchError((e) => e.toString()).then(print);
  // > Bad state: Too many elements
}


================================================
FILE: code/pt_Br/12_capitulo/18_stream_metodos_busca/main.dart
================================================
void main() {
  final stream =
      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();
  stream.elementAt(2).then(print); // > AI
  stream
      .firstWhere((valor) => valor.startsWith('A'),
          orElse: () => 'Nenhum valor começa com A')
      .then(print); //> AA
  stream
      .lastWhere((valor) => valor.startsWith('A'),
          orElse: () => 'Nenhum valor termina com A')
      .then(print); //> AU
  stream
      .singleWhere((valor) => valor.startsWith('A'))
      .then(print)
      .catchError(print);
  // > Bad state: Too many elements
}


================================================
FILE: code/pt_Br/12_capitulo/19_stream_metodos_validacao/main.dart
================================================
void main() {
  final stream =
      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();

  stream.any((valor) => valor.endsWith('E')).then(print); // > true
  stream.every((valor) => valor.startsWith('A')).then(print); // > true
  stream.contains('AO').then(print); // > true
}


================================================
FILE: code/pt_Br/12_capitulo/20_as_broadcast_stream/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  final single = controller.stream;
  final broadcast = single.asBroadcastStream(onListen: (StreamSubscription s) {
    print('Inscrição realizada');
  }, onCancel: (StreamSubscription s) {
    print('Todas inscrições canceladas');
  });

  final subscription = broadcast.listen(null);
  subscription.onData((e) {
    print('Novo elemento em broadcast $e');
    subscription.cancel();
  });

  controller.sink.add('42');
}


================================================
FILE: code/pt_Br/12_capitulo/21_distinct/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'A', 'I', 'I', 'A', 'U']);
  final distinctStream = stream.distinct();
  distinctStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/22_map/main.dart
================================================
void main() {
  final stream = Stream.fromIterable([4, 2]);
  final mapStream = stream.map((e) => e * 2);
  mapStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/23_expand/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'E']);
  final expandStream = stream.expand((e) => [e, e]);
  expandStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/24_async_map/main.dart
================================================
void main() {
  final stream = Stream.fromIterable([4, 2]);
  final mapStream =
      stream.asyncMap((e) => Future.delayed(Duration(seconds: 2), () => e * 2));
  mapStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/25_async_expand/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'E']);
  final expandStream = stream.asyncExpand((e) => Stream.fromIterable([e, e]));
  expandStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/26_skip/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);
  final skipStream = stream.skip(3);
  skipStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/27_skip_while/main.dart
================================================
void main() {
  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  final skipStream = stream.skipWhile((e) => e <= 6);
  skipStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/28_take/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);
  final takeStream = stream.take(3);
  takeStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/29_take_while/main.dart
================================================
void main() {
  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  final takeStream = stream.takeWhile((e) => e <= 3);
  takeStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/30_where/main.dart
================================================
void main() {
  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  final whereStream = stream.where((e) => e % 2 == 0);
  whereStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/31_timeout/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  controller.sink.add(4);
  Timer(Duration(seconds: 3), () {
    controller.sink.add(2);
    controller.close();
  });

  final timeoutStream = controller.stream.timeout(
    Duration(seconds: 2),
    onTimeout: (sink) {
      sink.add('Timeout excedido');
    },
  );

  timeoutStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/32_to_list_to_set/main.dart
================================================
void main() {
  final stream =
      Stream.fromIterable(['A', 'E', 'E', 'O', 'O']).asBroadcastStream();
  stream.toList().then(print);
  stream.toSet().then(print);
}


================================================
FILE: code/pt_Br/12_capitulo/33_drain/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  controller.sink.add(4);
  controller.sink.add(2);
  controller.close();
  controller.stream.drain('Stream encerrada').then(print);
}


================================================
FILE: code/pt_Br/12_capitulo/34_for_each/main.dart
================================================
void main() {
  final stream = Stream.fromIterable([4, 2]);
  stream
      .forEach((e) => print('Elemento: $e'))
      .then((v) => print('Future completo'));
}


================================================
FILE: code/pt_Br/12_capitulo/35_fold/main.dart
================================================
void main() {
  final streamUm = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);
  final streamDois = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  streamUm.fold('Vogais->', (a, b) => '[$a,$b]').then(print);
  streamDois.fold(10, (int a, int b) => a + b).then(print);
}


================================================
FILE: code/pt_Br/12_capitulo/36_reduce/main.dart
================================================
void main() {
  final streamUm = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);
  final streamDois = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);
  streamUm.reduce((a, b) => '[$a,$b]').then(print);
  streamDois.reduce((a, b) => a + b).then(print);
}


================================================
FILE: code/pt_Br/12_capitulo/37_join/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);
  stream.join('-').then(print);
}


================================================
FILE: code/pt_Br/12_capitulo/38_cast/main.dart
================================================
import 'dart:async';

void main() {
  final controller = StreamController();
  controller.sink.add(42);
  final novaStream = controller.stream.cast<String>();
  novaStream.listen(print);
}


================================================
FILE: code/pt_Br/12_capitulo/39_handle_error/main.dart
================================================
import 'dart:async';

void main() async {
  final controller = StreamController();
  controller.sink.add('4');
  controller.sink.addError('Erro');
  controller.sink.add('2');
  final streamError = controller.stream.handleError((e) {
    print('Erro capturado $e');
  });
  await for (var dado in streamError) {
    print('Novo evento: $dado');
  }
}


================================================
FILE: code/pt_Br/12_capitulo/40_pipe/main.dart
================================================
import 'dart:async';

void main() async {
  final controllerUm = StreamController();
  controllerUm.sink.add('4');
  controllerUm.sink.add('2');
  controllerUm.close();
  final controllerDois = StreamController();
  controllerUm.stream
      .pipe(controllerDois)
      .then((v) => print('Eventos adicionados'));
  controllerDois.stream.listen(print);
}


================================================
FILE: code/pt_Br/13_capitulo/01_interface_stream_transformer/main.dart
================================================
import 'dart:async';

class AlfabetoTransformer implements StreamTransformer<String, String> {
  AlfabetoTransformer({this.sufixo = '', this.prefixo = ''}) {
    _controller = StreamController(
        onListen: _onListen,
        onCancel: _onCancel,
        onPause: () => _subscription.pause,
        onResume: () => _subscription.resume);
  }

  AlfabetoTransformer.broadcast({this.sufixo = '', this.prefixo = ''}) {
    _controller =
        StreamController.broadcast(onListen: _onListen, onCancel: _onCancel);
  }

  late StreamController<String> _controller;
  late StreamSubscription<String> _subscription;
  late Stream<String> _streamEntrada;
  String sufixo;
  String prefixo;

  void _onListen() {
    _subscription = _streamEntrada.listen(_onData,
        onError: _controller.addError, onDone: _controller.close);
  }

  void _onCancel() {
    _subscription.cancel();
  }

  void _onData(String dado) {
    if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {
      _controller.sink.add('$prefixo$dado$sufixo');
    } else {
      _controller.sink.addError('Elemento inválido');
    }
  }

  @override
  Stream<String> bind(Stream<String> stream) {
    _streamEntrada = stream;
    return _controller.stream;
  }

  @override
  StreamTransformer<RS, RT> cast<RS, RT>() => StreamTransformer.castFrom(this);
}

void main() {
  final stream = Stream
      .fromIterable(['A', 'b', 'CC', 'D', '2', '@']
  );
  final streamTransformada = stream
      .transform(AlfabetoTransformer(sufixo: ']', prefixo: '['));
  streamTransformada.listen(print, onError: print);
}

================================================
FILE: code/pt_Br/13_capitulo/02_construtor_stream_transformer/main.dart
================================================
import 'dart:async';

StreamTransformer<String, String> criarTransformer({
  String sufixo = '',
  String prefixo = '',
}) {
  return StreamTransformer<String, String>(
      (Stream<String> streamEntrada, bool cancelOnError) {
    late StreamController<String> controller;
    late StreamSubscription<String> subscription;
    controller = StreamController<String>(
      onListen: () {
        subscription = streamEntrada.listen((dado) {
          if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {
            controller.sink.add('$prefixo$dado$sufixo');
          } else {
            controller.sink.addError('Elemento inválido');
          }
        },
            onDone: controller.close,
            onError: controller.addError,
            cancelOnError: cancelOnError);
      },
      onPause: () => subscription.pause(),
      onResume: () => subscription.resume(),
      onCancel: () => subscription.cancel(),
    );
    return controller.stream.listen(null);
  });
}

void main() {
  final stream = Stream.fromIterable(['z', '0', '%', 'U']);
  final streamTransformada =
      stream.transform(criarTransformer(sufixo: '-', prefixo: '-'));
  streamTransformada.listen(print, onError: print);
}


================================================
FILE: code/pt_Br/13_capitulo/03_stream_transformer_base/main.dart
================================================
import 'dart:async';

class AlfabetoTransformer extends StreamTransformerBase<String, String> {
  AlfabetoTransformer({
    String sufixo = '',
    String prefixo = '',
  }) : _transformer = criarTransformer(sufixo, prefixo);
  final StreamTransformer<String, String> _transformer;

  @override
  Stream<String> bind(Stream<String> stream) => _transformer.bind(stream);

  static StreamTransformer<String, String> criarTransformer(
      String sufixo, String prefixo) {
    return StreamTransformer<String, String>(
        (Stream<String> inputStream, bool cancelOnError) {
      late StreamController<String> controller;
      late StreamSubscription<String> subscription;
      controller = StreamController<String>(
        onListen: () {
          subscription = inputStream.listen(
            (dado) {
              if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {
                controller.sink.add('$prefixo$dado$sufixo');
              } else {
                controller.sink.addError('Elemento inválido');
              }
            },
            onDone: controller.close,
            onError: controller.addError,
          );
        },
        onPause: () => subscription.pause(),
        onResume: () => subscription.resume(),
        onCancel: () => subscription.cancel(),
      );
      return controller.stream.listen(null);
    });
  }
}

void main() {
  final stream = Stream.fromIterable(['FF', 'f', '42', '-']);
  final streamTransformada =
      stream.transform(AlfabetoTransformer(sufixo: '/', prefixo: '/'));
  streamTransformada.listen(print, onError: print);
}


================================================
FILE: code/pt_Br/13_capitulo/04_stream_transformer_from_handlers/main.dart
================================================
import 'dart:async';

StreamTransformer<String, String> criarTransformer({
  String sufixo = '',
  String prefixo = '',
}) {
  return StreamTransformer.fromHandlers(
      handleData: (String dado, EventSink<String> sink) {
    if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {
      sink.add('$prefixo$dado$sufixo');
    } else {
      sink.addError('Elemento inválido');
    }
  }, handleError:
          (Object error, StackTrace stackTrace, EventSink<String> sink) {
    sink.addError('Erro stream');
  }, handleDone: (EventSink<String> sink) {
    sink.add('Stream finalizada');
  });
}

void main() {
  StreamController<String>? controller;
  controller = StreamController<String>(onListen: () {
    controller!.sink.add('j');
    controller.sink.add('42');
    controller.sink.addError('Erro!');
    controller.close();
  });
  final streamTransformada =
      controller.stream.transform(criarTransformer(sufixo: '*', prefixo: '*'));
  streamTransformada.listen(print, onError: print);
}


================================================
FILE: code/pt_Br/13_capitulo/05_stream_transformer_from_bind/main.dart
================================================
import 'dart:async';

class AlfabetoTransformer extends StreamTransformerBase<String, String> {
  AlfabetoTransformer({
    String sufixo = '',
    String prefixo = '',
  }) : _transformer = criarTransformer(sufixo, prefixo);
  final StreamTransformer<String, String> _transformer;

  @override
  Stream<String> bind(Stream<String> stream) => _transformer.bind(stream);

  static StreamTransformer<String, String> criarTransformer(
      String sufixo, String prefixo) {
    return StreamTransformer<String, String>(
        (Stream<String> inputStream, bool cancelOnError) {
      late StreamController<String> controller;
      late StreamSubscription<String> subscription;
      controller = StreamController<String>(
        onListen: () {
          subscription = inputStream.listen(
            (dado) {
              if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) {
                controller.sink.add('$prefixo$dado$sufixo');
              } else {
                controller.sink.addError('Elemento inválido');
              }
            },
            onDone: controller.close,
            onError: controller.addError,
          );
        },
        onPause: () => subscription.pause(),
        onResume: () => subscription.resume(),
        onCancel: () => subscription.cancel(),
      );
      return controller.stream.listen(null);
    });
  }
}

final alfabetoMinusculoTransformer = StreamTransformer.fromBind(
    (Stream<String> stream) => stream
        .transform(AlfabetoTransformer(sufixo: '}', prefixo: '{'))
        .map((dado) => dado.toLowerCase()));

void main() {
  final stream = Stream.fromIterable(['F', 'f', '42', 'J']);
  final streamTransformada = stream.transform(alfabetoMinusculoTransformer);
  streamTransformada.listen(print, onError: print);
}


================================================
FILE: code/pt_Br/13_capitulo/06_problema_inscricao_unica/main.dart
================================================
void main() {
  final stream = Stream.fromIterable(['Stream', 'inscrição', 'única']);
  stream.first.then(print); // > Stream
  // stream.listen(null); // > Bad state: Stream has already been listened to.
}


================================================
FILE: code/pt_Br/13_capitulo/07_sem_perda_eventos/main.dart
================================================
import 'dart:async';

Stream<int> get streamNumeros {
  final controller = StreamController<int>();
  var i = 1;
  Timer.periodic(Duration(seconds: 1), (timer) {
    if (i == 10) timer.cancel();
    controller.sink.add(i++);
  });
  return controller.stream;
}

void main() {
  final stream = streamNumeros;
  Future.delayed(Duration(seconds: 5), () {
    stream.listen(print);
  });
}


================================================
FILE: code/pt_Br/13_capitulo/08_perda_eventos_broadcast/main.dart
================================================
import 'dart:async';

Stream<int> get streamNumeros {
  final controller = StreamController<int>.broadcast();
  var i = 1;
  Timer.periodic(Duration(seconds: 1), (timer) {
    if (i == 10) timer.cancel();
    controller.sink.add(i++);
  });
  return controller.stream;
}

void main() {
  final stream = streamNumeros;
  Future.delayed(Duration(seconds: 7), () {
    stream.listen((e) {
      print('Inscrição A $e');
    });
  });
  Future.delayed(Duration(seconds: 9), () {
    stream.listen((e) {
      print('Inscrição B $e');
    });
  });
}


================================================
FILE: code/pt_Br/13_capitulo/09_broadcast_subscription_buffer/main.dart
================================================
import 'dart:async';

Stream<int> get streamNumeros {
  final controller = StreamController<int>.broadcast();
  var i = 1;
  Timer.periodic(Duration(seconds: 1), (timer) {
    if (i == 10) timer.cancel();
    controller.sink.add(i++);
  });
  return controller.stream;
}

void main() {
  final stream = streamNumeros;
  Future.delayed(Duration(seconds: 2), () {
    final inscricao = stream.listen(print);
    Future.delayed(Duration(seconds: 2), () {
      inscricao.pause();
      Future.delayed(Duration(seconds: 3), () {
        inscricao.resume();
      });
    });
  });
}


================================================
FILE: code/pt_Br/13_capitulo/10_geradores_sincronos_yield/main.dart
================================================
import 'dart:io';

Iterable<int> numeros() sync* {
  print('Gerador iniciado');
  for (int i = 0; i < 3; i++) {
    sleep(Duration(seconds: 2));
    yield i;
  }
  print('Gerador finalizado');
}

void main() {
  print('Início main');
  final iterable = numeros();
  print('Começo iteração:');
  Iterator i = iterable.iterator;
  while (i.moveNext()) print('Número: ${i.current}');
  print('Término main');
}


================================================
FILE: code/pt_Br/13_capitulo/11_geradores_sincronos_yield_*/main.dart
================================================
Iterable<dynamic> letrasNumeros() sync* {
  for (int i = 1; i < 3; i++) yield i;
  yield* letras();
}

Iterable<String> letras() sync* {
  yield* ['A', 'B'];
}

void main() async {
  for (var i in letrasNumeros()) print('Valor: ${i}');
}


================================================
FILE: code/pt_Br/13_capitulo/12_geradores_assincronos_yield/main.dart
================================================
Stream<int> numeros() async* {
  print('Gerador iniciado');
  for (int i = 0; i < 3; i++) {
    await Future.delayed(Duration(seconds: 2));
    yield i;
  }
  print('Gerador finalizado');
}

void main() {
  print('Início main');
  final stream = numeros();
  stream.listen((i) => print('Número: $i'));
  print('Término main');
}

================================================
FILE: code/pt_Br/13_capitulo/13_geradores_assincronos_yield_*/main.dart
================================================
Stream<dynamic> letrasNumeros() async* {
  yield* letras();
  for (int i = 1; i < 3; i++) yield i;
}

Stream<String> letras() async* {
  yield* Stream.fromIterable(['A', 'B']);
}

void main() async {
  await for (var i in letrasNumeros()) print('Valor: ${i}');
}


================================================
FILE: code/pt_Br/13_capitulo/14_server/main.dart
================================================
import 'dart:io';

void main() async {
  var server = await HttpServer.bind('127.0.0.1', 8080);
  await for (HttpRequest request in server) {
    request.response.write('Primeiro server em Dart!');
    await request.response.close();
  }
}


================================================
FILE: code/pt_Br/14_capitulo/01_isolate/main.dart
================================================
import 'dart:isolate';

void main() async {
  Isolate mainIsolate = Isolate.current;
  print('Executando na isolate: {${mainIsolate.debugName}}');
  mainIsolate.kill(priority: Isolate.immediate);
  print('fim do main()');
}


================================================
FILE: code/pt_Br/14_capitulo/02_nova_isolate/main.dart
================================================
import 'dart:isolate';

void main() async {
  Isolate mainIsolate = Isolate.current;
  print('Executando na isolate: {${mainIsolate.debugName}}');
  await Isolate.spawn(funcaoEntrada, 'Olá nova Isolate.',
      debugName: 'novaIsolate');


      Isolate.run(computation)
}

void funcaoEntrada(String parametro) {
  final isolate = Isolate.current;
  print('Executando na isolate: {${isolate.debugName}}');
  print('Parâmetro: $parametro');
}


================================================
FILE: code/pt_Br/14_capitulo/03_unidirecional_unica/main.dart
================================================
import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn(workerIsolate, receivePort.sendPort);
  receivePort.first.then((dado) => print('Mensagem recebida: $dado'));
}

void workerIsolate(SendPort sendPort) async {
  final resposta =
      await Future.delayed(Duration(seconds: 2), () => 'Conteúdo do arquivo');
  Isolate.exit(sendPort, resposta);
}


================================================
FILE: code/pt_Br/14_capitulo/04_unidirecional_frequente/main.dart
================================================
import 'dart:async';
import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn(workerIsolate, receivePort.sendPort);
  receivePort.listen((dado) {
    print('Mensagem recebida: $dado');
  });
}

void workerIsolate(SendPort sendPort) async {
  sendPort.send('Upload iniciado');
  Timer.periodic(Duration(milliseconds: 100), (timer) {
    if (timer.tick % 10 == 0) sendPort.send('Upload ${timer.tick} % ');
    if (timer.tick == 100) {
      timer.cancel();
      sendPort.send('Upload encerrado');
    }
  });
}


================================================
FILE: code/pt_Br/14_capitulo/05_bidirecional/main.dart
================================================
import 'dart:async';
import 'dart:isolate';

Future<SendPort> isolateBidirecional(
    ReceivePort receivePort, void onMessage(var message)) async {
  final completer = Completer<SendPort>();
  print('[MAIN Isolate]: Iniciado comunicação, aguardando handshake');
  receivePort.listen((mensagem) {
    if (mensagem is SendPort) {
      completer.complete(mensagem);
    } else {
      onMessage(mensagem);
    }
  });
  await Isolate.spawn(novaIsolate, receivePort.sendPort);
  return completer.future;
}

void novaIsolate(SendPort sendPort) {
  print(
      '[NOVA Isolate]: Solicitação de comunicação recebida, enviando resposta');
  final receivePort = ReceivePort();
  receivePort.listen((mensagem) {
    print('[NOVA Isolate]: Mensagem recebida $mensagem');
  });
  sendPort.send(receivePort.sendPort);
  Timer.periodic(Duration(seconds: 2), (timer) {
    sendPort.send(timer.tick);
    if (timer.tick == 10) timer.cancel();
  });
}

void main() async {
  final receivePort = ReceivePort();
  SendPort sendPort = await isolateBidirecional(receivePort, (mensagem) {
    print('[MAIN Isolate]: Mensagem recebida $mensagem');
  });
  print(
      '[MAIN Isolate]: Handshake concluído, comunicação bidirecional estabelecida.');
  Timer.periodic(Duration(seconds: 1), (timer) {
    sendPort.send(timer.tick);
    if (timer.tick == 10) timer.cancel();
  });
}


================================================
FILE: code/pt_Br/14_capitulo/06_controle_isolate/main.dart
================================================
import 'dart:async';
import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();
  final isolate = await Isolate.spawn(novaIsolate, receivePort.sendPort);
  final capability = Capability();
  Future.delayed(Duration(seconds: 1), () {
    isolate.pause(capability);
  });
  Future.delayed(Duration(seconds: 3), () {
    isolate.resume(capability);
  });
  receivePort.listen((dado) {
    print('Mensagem recebida: $dado');
    if (dado == 7) {
      isolate.kill(priority: Isolate.immediate);
      receivePort.close();
    }
  });
}

void novaIsolate(SendPort sendPort) async {
  Timer.periodic(Duration(milliseconds: 500), (timer) {
    sendPort.send(timer.tick);
  });
}

================================================
FILE: code/pt_Br/14_capitulo/07_isolate_listeners/main.dart
================================================
import 'dart:async';
import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();
  receivePort.listen((dado) {
    print('Mensagem recebida: $dado');
  });
  final isolate = await Isolate.spawn(novaIsolate, receivePort.sendPort,
      errorsAreFatal: true);
  isolate.addOnExitListener(receivePort.sendPort,
      response: 'Isolate finalizada');
  isolate.addErrorListener(receivePort.sendPort);
  Future.delayed(Duration(seconds: 1), () {
    isolate.ping(receivePort.sendPort, response: 'Ping com sucesso');
  });
}

void novaIsolate(SendPort sendPort) async {
  Future.delayed(Duration(seconds: 2), () {
    throw TimeoutException('Exceção na isolate');
  });
}


================================================
FILE: code/pt_Br/14_capitulo/08_spawn_uri/isolate.dart
================================================
import 'dart:isolate';

void main(List<String> args, SendPort sendPort) {
  print('[${Isolate.current.debugName}] - Args {$args}');
  sendPort.send('Esse livro é muito massa mesmo!');
}


================================================
FILE: code/pt_Br/14_capitulo/08_spawn_uri/main.dart
================================================
import 'dart:isolate';

void main() async {
  final receivePort = ReceivePort();
  receivePort.listen((dado) {
    print('[IsolatePrincipal] - $dado');
  });
  await Isolate.spawnUri(
      Uri.parse('isolate.dart'), ['Args 1', 'Args 2'], receivePort.sendPort,
      debugName: 'IsolateSeparada');
}


================================================
FILE: code/pt_Br/14_capitulo/09_isolate_run/main.dart
================================================
import 'dart:convert';
import 'dart:isolate';

void main() async {
  final (int id, String cliente) = await Isolate.run(() async {
    final json = await Future.delayed(Duration(seconds: 2), () {
      return '{"id": 42,"cliente": "Elon Musk"}';
    });
    
    final dados = jsonDecode(json);
    return (dados['id'] as int, dados['cliente'] as String);
  });

  print('Cliente mais rico: [id: $id, nome: $cliente]');
}

================================================
FILE: code/pt_Br/14_capitulo/10_zone_root/main.dart
================================================
import 'dart:async';

void main() {
  final root = Zone.current;
  print(root); // > Instance of '_RootZone'
}


================================================
FILE: code/pt_Br/14_capitulo/11_nova_zone/main.dart
================================================
import 'dart:async';

void main() {
  final root = Zone.current;
  print('Zone principal: $root');
  final novaZone = root.fork();
  novaZone.run(() {
    print('Zone nova: ${Zone.current}');
    print('Zone nova pai: ${Zone.current.parent}');
  });
}


================================================
FILE: code/pt_Br/14_capitulo/12_run_zoned/main.dart
================================================
import 'dart:async';

void main() {
  runZoned(() {
    print('Zone nova: ${Zone.current}');
    print('Zone nova pai: ${Zone.current.parent}');
  });
}


================================================
FILE: code/pt_Br/14_capitulo/13_hierarquia_zones/main.dart
================================================
import 'dart:async';

void main() {
  a();
  Future? future;
  runZoned(() {
    future = Future(a).then(b);
  });
  future?.then(c);
}

a() => print('a');

b(valor) => runZoned(() => a());

c(valor) => print('c');


================================================
FILE: code/pt_Br/14_capitulo/14_zone_livre_erros/main.dart
================================================
import 'dart:async';

void main() {
  runZonedGuarded(() {
    mainZonedGuarded();
  }, (e, s) {
    print('Erro capturado: $e');
  });
}

void mainZonedGuarded() {
  Future(() => throw TimeoutException('Um erro qualquer'));
  Future(() => throw 'Outro erro qualquer');
  Future(() => throw 'Mais um erro qualquer');
}


================================================
FILE: code/pt_Br/14_capitulo/15_propagacao_erros_zones/main.dart
================================================
import 'dart:async';

void main() {
  runZonedGuarded(() {
    runZoned(() {
      Future(() => throw TimeoutException('Um erro qualquer na zone#3'));
    });
  }, (e, s) {
    print('Erro capturado na zone#2 $e');
  });
}


================================================
FILE: code/pt_Br/14_capitulo/16_propagacao_erros_zones_2/main.dart
================================================
import 'dart:async';

void main() {
  Future? future;
  runZonedGuarded(() {
    future = Future(() => throw TimeoutException('Um erro qualquer'));
  }, (e, s) {
    print('Erro capturado na zone $e');
  });
  future!.catchError((e) => print('Nunca executa'));
}


================================================
FILE: code/pt_Br/14_capitulo/17_propagacao_erros_zones_3/main.dart
================================================
import 'dart:async';

void main() {
  final future = Future(() => throw TimeoutException('Um erro qualquer'));
  future.whenComplete(() => print('whenComplete zone#1'));
  runZonedGuarded(() {
    future.whenComplete(() => print('whenComplete zone#2'));
    print('Dentro zone#2');
  }, (e, s) {
    print('Erro capturado na zone#2 $e');
  });
  runZoned(() {
    future.whenComplete(() => print('whenComplete zone#3'));
  });
}


================================================
FILE: code/pt_Br/14_capitulo/18_valores_locais_zones/main.dart
================================================
import 'dart:async';

void main() {
  runZoned(() {
    print(Zone.current['resposta']); // > 42
  }, zoneValues: {'resposta': 42});

  /// Usando symbol como chave
  runZoned(() {
    print(Zone.current[#resposta]); // > 42
  }, zoneValues: {#resposta: 42});

  /// Sobrescrevendo valores globais
  runZoned(() {
    logZone();
    runZoned(() {
      logZone();
      print('Resposta ${Zone.current[#resposta]}');
    }, zoneValues: {#nomeZone: 'Zone B'});
  }, zoneValues: {#nomeZone: 'Zone A', #resposta: 42});
}

void logZone() => print('Rodando na ${Zone.current[#nomeZone]}');


================================================
FILE: code/pt_Br/14_capitulo/19_zone_specification/main.dart
================================================
import 'dart:async';

void main() {
  runZoned(() {
    print('Teste log');
    print('42');
  }, zoneSpecification: ZoneSpecification(
      print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
    parent.print(zone, '${DateTime.now()} - $line');
  }));
}


================================================
FILE: code/pt_Br/15_capitulo/01_criacao_diretorio/main.dart
================================================
import 'dart:io';

Future<void> main() async {
  final dir = Directory('dir/teste');
  await dir.create(recursive: true);
  print('Diretórios criados: $dir');
  // > Diretórios criados: Directory: 'dir/teste'
}


================================================
FILE: code/pt_Br/15_capitulo/02_remocao_diretorio/main.dart
================================================
import 'dart:io';

Future<void> main() async {
  final dir = Directory('dir/teste');
  // await dir.create(recursive: true);

  if (await dir.exists()) {
    await dir.delete(recursive: true);
    print('Diretório removido: $dir');
    // > Diretório removido: Directory: 'dir/teste'
  }
}


================================================
FILE: code/pt_Br/15_capitulo/03_criacao_arquivo/main.dart
================================================
import 'dart:io';

Future<void> main() async {
  final file = File('teste.txt');
  await file.create();
  print('Arquivo criado: $file'); // > Arquivo criado: File: 'teste.txt'
}


================================================
FILE: code/pt_Br/15_capitulo/03_criacao_arquivo/teste.txt
================================================


================================================
FILE: code/pt_Br/15_capitulo/04_escrita_arquivo/main.dart
================================================
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  final file = File('teste.txt');
  await file.writeAsString('linha um', encoding: Utf8Codec());
  await file.writeAsString('\nlinha dois', mode: FileMode.append);
}


================================================
FILE: code/pt_Br/15_capitulo/04_escrita_arquivo/teste.txt
================================================
linha um
linha dois

================================================
FILE: code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/main.dart
================================================
import 'dart:io';

Future<void> main() async {
  final file = File('teste.txt');
  IOSink sink = file.openWrite(mode: FileMode.write);
  await for (String texto in gerarStream()) {
    sink.write(texto);
    await sink.flush();
  }
  await sink.close();
}

Stream<String> gerarStream() async* {
  for (int i = 0; i <= 10; i++) {
    await Future.delayed(Duration(seconds: 1));
    yield '$i\n';
  }
}


================================================
FILE: code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/teste.txt
================================================
0
1
2
3
4
5
6
7
8
9
10


================================================
FILE: code/pt_Br/15_capitulo/06_ler_arquivo/main.dart
================================================
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  final file = File('teste.txt');
  String texto = await file.readAsString(encoding: Utf8Codec());
  print(texto);
}


================================================
FILE: code/pt_Br/15_capitulo/06_ler_arquivo/teste.txt
================================================
0
1
2
3
4
5
6
7
8
9
10


================================================
FILE: code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/main.dart
================================================
import 'dart:io';
import 'dart:convert';

Future<void> main() async {
  final file = File('teste.txt');
  Stream<List<int>> streamBytes = file.openRead();
  Stream<String> linhas =
      utf8.decoder.bind(streamBytes).transform(LineSplitter());
  await for (var linha in linhas) {
    print('Valor da linha: ${linha}');
  }
}


================================================
FILE: code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/teste.txt
================================================
0
1
2
3
4
5
6
7
8
9
10


================================================
FILE: code/pt_Br/e_com_voce/02_imc/main.dart
================================================
void main() {
  int idade = 26;
  double altura = 1.71; // centimetros
  double peso = 64.2; // quilogramas

  double imc = peso / (altura * altura);
  print('IMC: $imc');

  if (idade < 20) {
    /// crianças/adolescentes
    if (imc < 13) {
      print('Abaixo do peso');
    } else if (imc >= 13 && imc < 16.8) {
      print('Peso normal ideal');
    } else if (imc >= 16.8 && imc < 18.3) {
      print('Sobrepeso');
    } else {
      print('Obesidade');
    }
  } else if (idade >= 20 && idade < 59) {
    /// adultos
    if (imc < 18.5) {
      print('Abaixo do peso');
    } else if (imc >= 18.5 && imc < 25) {
      print('Peso normal ideal');
    } else if (imc >= 25 && imc < 30) {
      print('Sobrepeso');
    } else if (imc >= 30 && imc < 35) {
      print('Obesidade grau 1');
    } else if (imc >= 35 && imc < 40) {
      print('Obesidade grau 2');
    } else {
      print('Obesidade grau 3');
    }
  } else {
    /// idosos
    if (imc < 22) {
      print('Abaixo do peso');
    } else if (imc >= 22 && imc < 27) {
      print('Peso normal ideal');
    } else {
      print('Obesidade');
    }
  }
}


================================================
FILE: code/pt_Br/e_com_voce/03_benchmark_strings/main.dart
================================================
/*
Com 9999 Strings:
0:00:00.007252 : StringBuffer
0:00:00.178047 : Concatenação

Com 99999 Strings
0:00:00.020247 : StringBuffer
0:03:59.309432 : Concatenação
*/
const quantidade = 9999;

void main() {
  print("Benchmarking $quantidade strings");

  print("${medir(usarStringBuffer)} : StringBuffer");
  print("${medir(usarConcatenacao)} : Concatenação");
}

Duration medir(Function fn) {
  final sw = Stopwatch();
  sw.start();
  fn();
  return sw.elapsed;
}

void usarStringBuffer() {
  var hodor = new StringBuffer();

  for (var i = quantidade; i > 0; i--) {
    hodor.write(i.toString());
    hodor.write(" hold the door\n");
  }

  hodor.toString();
}

void usarConcatenacao() {
  var hodor = '';

  for (var i = quantidade; i > 0; i--) {
    hodor += i.toString();
    hodor += " hold the door\n";
  }
}

================================================
FILE: code/pt_Br/e_com_voce/03_circunferencia/main.dart
================================================
import 'dart:io';
import 'dart:math';

final dynamic a = 'dinâmica?';
const dynamic b = 'dinâmica?';


void main() {
  print("------ Cálculo de circunferência ------");

  print("> Qual o raio para cálculo?");
  final raio = double.tryParse(stdin.readLineSync() ?? '');
  //tryParse() retorna null caso não consiga converter para double

  if(raio == null) {
    print('Esse não é um valor de raio válido..');
    exit(0); //Finaliza o programa
  }

  print('A circunferência é: ${2 * raio * pi}');
  // pi é uma constante de dart:math

  print("------------------------");
}

class A {
  final dynamic a = 'dinâmica?';
}

================================================
FILE: code/pt_Br/e_com_voce/03_regex_cpf/main.dart
================================================
void main() {
  final regExp = RegExp(r'^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$');

  print(regExp.hasMatch('000'));
  print(regExp.hasMatch('000111222333'));
  print(regExp.hasMatch('000.111.222-333'));
  print(regExp.hasMatch('000.111.22299'));
  print(regExp.hasMatch('000.111.222-99'));
  print(regExp.hasMatch('000111222-99'));
  print(regExp.hasMatch('00011122299'));
}

================================================
FILE: code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao/main.dart
================================================
import 'dart:io';

main() {
  print('Insira o número para cálculo do fatorial:');
  final numero = int.tryParse(stdin.readLineSync() ?? '') ?? 0;

  print('Resultado: ${fatorial(numero)}');
}

/// Modo 1:
int fatorial(int numero) {
 if(numero == 0) return 1; // regra especial 0! = 1
 return numero * fatorial(numero - 1);
}

/// Modo 2:
// int fatorial(int numero) => numero == 0 ? 1 : numero * fatorial(numero - 1);

================================================
FILE: code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao_closure/main.dart
================================================
import 'dart:io';

main() {
  print('Insira o número para cálculo do fatorial:');
  final numero = int.tryParse(stdin.readLineSync() ?? '') ?? 0;

  print('Resultado: ${calcularFatorial(numero)}');
}

/// Modo 1:
int calcularFatorial(int numero) {
 int fatorial(int numero) {
   if (numero == 0) return 1; // regra especial 0! = 1
   return numero * fatorial(numero - 1);
 }

 return fatorial(numero);
}

/// Modo 2:
// int calcularFatorial(int numero) {
//   int fatorial(int numero) => numero == 0 ? 1 : numero * fatorial(numero - 1);
//
//   return fatorial(numero);
// }


================================================
FILE: code/pt_Br/e_com_voce/05_try_catch_rethrow/main.dart
================================================
void main() {
  try {
    buscarUsuario();
  } catch (e, s) {
    print(e);
    print(s.toString());
    print('Catch de erro global');
  }
}

void buscarUsuario() {
  try {
    buscarUsuarioCache();
    buscarUsuarioBancoDados();
  } catch (e) {
    if (e is CacheException) {
      print('Não trataremos erro de cache nesse método..');

      /// Um throw e; não mantém o stacktrace original.
      // throw e;
      rethrow;
    }

    print('Tratando demais erros.');
  }
}

void buscarUsuarioCache() {
  throw CacheException('erro ao buscar o usuário no cache');
}

void buscarUsuarioBancoDados() {}

class CacheException implements Exception {
  final String mensagem;

  const CacheException(this.mensagem);
}


================================================
FILE: code/pt_Br/e_com_voce/08_construtor_inicializadores/main.dart
================================================
import 'dart:math';

class Circunferencia {
  final double resultado;

  /// Inicializar valores e utilizar assert
  Circunferencia(double raio)
      : resultado = 2 * pi * raio,
        assert(raio >= 0);
}

class Subclasse extends Circunferencia {
  /// Chamada para construtor de superclasse
  Subclasse(double raio) : super(raio);
}

void main() {
  final c = Circunferencia(5);
  print(c.resultado);

  final s = Subclasse(5);
  print(s.resultado);
}


================================================
FILE: code/pt_Br/e_com_voce/08_redirecionando_construtores/main.dart
================================================
class Coordenada {
  int x, y;

  Coordenada(this.x, this.y);

  /// Redireciona para o construtor padrão
  Coordenada.inicio() : this(0, 0);

  /// Redireciona para o construtor padrão
  Coordenada.xZero(int y) : this(0, y);

  /// Redireciona para o construtor padrão
  Coordenada.yZero(int x) : this(x, 0);

  String toString() {
    return 'Coordenada{x: $x, y: $y}';
  }
}

void main() {
  final um = Coordenada(42, 42);
  final dois = Coordenada.inicio();
  final tres = Coordenada.xZero(42);
  final quatro = Coordenada.yZero(42);

  print(um);
  print(dois);
  print(tres);
  print(quatro);
}


================================================
FILE: code/pt_Br/e_com_voce/08_singleton/main.dart
================================================
/// Singleton com Factory
class SingletonUm {
  SingletonUm._();

  static final SingletonUm _instance = SingletonUm._();

  factory SingletonUm() {
    return _instance;
  }
}

/// Singleton com get
class SingletonDois {
  SingletonDois._();

  static final SingletonDois _instance = SingletonDois._();

  static SingletonDois get instance {
    return _instance;
  }
}

/// Singleton com static
class SingletonTres {
  SingletonTres._();

  static final SingletonTres instance = SingletonTres._();
}

void main() {
  SingletonUm a = SingletonUm();
  SingletonUm b = SingletonUm();
  print('SingletonUm identical: ${identical(a, b)}');

  SingletonDois c = SingletonDois.instance;
  SingletonDois d = SingletonDois.instance;
  print('SingletonDois identical: ${identical(c, d)}');

  SingletonTres e = SingletonTres.instance;
  SingletonTres f = SingletonTres.instance;
  print('SingletonTres identical: ${identical(e, f)}');
}


================================================
FILE: code/pt_Br/e_com_voce/09_bidirectional_iterator/main.dart
================================================

class BidirectionalIteratorList<E> {
  BidirectionalIteratorList(Iterable<E> iterable, {bool back = false})
      : _iterable = iterable,
        _length = iterable.length,
        _index = back ? iterable.length - 1 : 0;

  final Iterable<E> _iterable;
  final int _length;
  int _index;
  E? _current;

  get current => _current;

  bool moveNext() {
    int length = _iterable.length;
    if (_length != length) throw ConcurrentModificationError(_iterable);
    if (_index >= length) {
      _current = null;
      return false;
    }
    _current = _iterable.elementAt(_index);
    _index++;
    return true;
  }

  bool movePrevious() {
    int length = _iterable.length;
    if (_length != length) throw ConcurrentModificationError(_iterable);
    if (_index < 0) {
      _current = null;
      return false;
    }
    _current = _iterable.elementAt(_index);
    _index--;
    return true;
  }
}

void main() {
  final risadas = ['kkk', 'haha', 'rsrs'];

  print('Ordem natural:');
  final iteratorNext = BidirectionalIteratorList(risadas);
  while (iteratorNext.moveNext()) print(iteratorNext.current);

  print('Ordem trás pra frente:');
  final iteratorPrevious = BidirectionalIteratorList(risadas, back: true);
  while (iteratorPrevious.movePrevious()) print(iteratorPrevious.current);
}


================================================
FILE: code/pt_Br/e_com_voce/09_programador_comparable/main.dart
================================================
class Programador implements Comparable<Programador> {
  Programador({required this.nome, required this.salario});

  String nome;
  double salario = 0.0;
  List<String> tarefas = [];
  List<String>? linguagens;

  void trabalhar() {}

  int compareTo(Programador other) {
//    return salario.compareTo(other.salario); //CompareTo salário
    return nome.compareTo(other.nome);
  }

  String toString() => 'Programador{nome: $nome, salario: $salario}';
}

void main() {
  final programadores = [
    Programador(nome: 'James Gosling', salario: 3000),
    Programador(nome: 'Bill Gates', salario: 5000),
    Programador(nome: 'Larry Page', salario: 2000),
  ];
  print('Lista sem ordem: $programadores');
  programadores.sort();
  print('Lista sorteada: $programadores');
}


================================================
FILE: code/pt_Br/e_com_voce/09_teoria_conjuntos_set/main.dart
================================================
void main() {
  final a = {'c', 'a', 'r', 'e', 't'};
  final b = {'a', 'e', 'i', 'o', 'u'};
  print('Conjunto a: $a');
  print('Conjunto b: $b');

  // União
  print('União de a e b: ${a.union(b)}');

  // Interseção
  print('Interseção de a e b: ${a.intersection(b)}');

  // Diferença
  print('Diferença de a e b: ${a.difference(b)}');
  print('Diferença de b e a: ${b.difference(a)}');
}

================================================
FILE: code/pt_Br/e_com_voce/10_microtask_infinita/main.dart
================================================
import 'dart:async';

import 'dart:io';

int counter = 0;

/// O Future nunca é executado por conta da prioridade da microtask queue
main() {
  print('Início main()');
  criarMicrotask();
  Future(() => 42).then(print);
  print('Fim main()');
}

criarMicrotask() {
  scheduleMicrotask(() {
    counter++;
    print('microtask $counter');
    sleep(Duration(seconds: 1));
    criarMicrotask();
  });
}

================================================
FILE: code/pt_Br/e_com_voce/13_gerador_divisores/main.dart
================================================
import 'dart:io';

Stream<int> divisores(int numero) async* {
  for (int i = 1; i <= numero; i++) {
    if (numero % i == 0) yield i;
  }
}

Future<void> main() async {
  print('Insira o valor:');
  final numero = int.parse(stdin.readLineSync()!);

  print('Todos os divisores de $numero:');
  await for (final e in divisores(numero)) {
    print('Número: $e');
  }
}


================================================
FILE: code/pt_Br/e_com_voce/13_gerador_valores_impar/main.dart
================================================
Stream<int> numerosImpar() async* {
  for (int i = 0; i < 1000; i++) {
    if (i % 2 != 0) yield i;
  }
}

Future<void> main() async {
  print('Todos os valores ímpares de 0 a 1000:');
  await for (final e in numerosImpar()) {
    print('Número: $e');
  }
  print('Fim');
}


================================================
FILE: code/pt_Br/e_com_voce/13_stream_transformer_email/main.dart
================================================
import 'dart:async';

const emailPattern =
    r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$';

StreamTransformer<String, String> transformerEmail() {
  return StreamTransformer.fromHandlers(
      handleData: (String dado, EventSink<String> sink) {
    final regExp = RegExp(emailPattern);

    if (regExp.hasMatch(dado)) {
      sink.add('E-mail válido: $dado');
    } else {
      sink.addError('---> Inválido: $dado');
    }
  }, handleError:
          (Object error, StackTrace stackTrace, EventSink<String> sink) {
    sink.addError('Erro stream');
  }, handleDone: (EventSink<String> sink) {
    sink.add('Stream finalizada');
  });
}

void main() {
  StreamController<String>? controller;
  controller = StreamController<String>(onListen: () {
    controller!.sink.add('jhb@aaa');
    controller.sink.add('jhb@gmail.com');
    controller.sink.add('peter-parker@marvel.com');
    controller.sink.add('julio.gmail.com');
    controller.close();
  });
  final streamEmail = controller.stream.transform(transformerEmail());
  streamEmail.listen(print, onError: print);
}


================================================
FILE: code/pt_Br/e_com_voce/13_stream_transformer_telefone/main.dart
================================================
import 'dart:async';

const telefonePattern =
    r'^(?:(?:\+|00)?(55)\s?)?(?:(?:\(?[1-9][0-9]\)?)?\s?)?(?:((?:9\d|[2-9])\d{3})-?(\d{4}))$';

StreamTransformer<String, String> transformerTelefone() {
  return StreamTransformer.fromHandlers(
      handleData: (String dado, EventSink<String> sink) {
    final regExp = RegExp(telefonePattern);

    if (regExp.hasMatch(dado)) {
      sink.add('Telefone válido: $dado');
    } else {
      sink.addError('---> Inválido: $dado');
    }
  }, handleError:
          (Object error, StackTrace stackTrace, EventSink<String> sink) {
    sink.addError('Erro stream');
  }, handleDone: (EventSink<String> sink) {
    sink.add('Stream finalizada');
  });
}

void main() {
  StreamController<String>? controller;
  controller = StreamController<String>(onListen: () {
    controller!.sink.add('4891883344');
    controller.sink.add('(473) 998735467');
    controller.sink.add('47991433265');
    controller.sink.add('(47) 998735467');
    controller.sink.add('473998735467');
    controller.sink.add('554891883344');
    controller.close();
  });
  final streamEmail = controller.stream.transform(transformerTelefone());
  streamEmail.listen(print, onError: print);
}


================================================
FILE: code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/main.dart
================================================
import 'dart:isolate';

import 'package:stream_channel/isolate_channel.dart';

void main(args) async {
  final receivePort = ReceivePort();
  final channel = IsolateChannel.connectReceive(receivePort);
  channel.stream.listen((data) {
    print('<mainIsolate> mensagem recebida: $data');
  });
  await Isolate.spawn(novaIsolate, receivePort.sendPort);
  channel.sink.add('Alguém ta me ouvindo? Câmbio desligo.');
}

void novaIsolate(SendPort sPort) {
  final channel = IsolateChannel.connectSend(sPort);
  channel.stream.listen((data) {
    print('<novaIsolate> mensagem recebida: $data');
  });
  channel.sink.add('Oi isolate main. Câmbio desligo.');
}


================================================
FILE: code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/pubspec.yaml
================================================
name: isolate_bidirecional
description: Comunicação bidirecional em isolates pelo stream_channel.
version: 1.0.0

environment:
  sdk: ^3.5.1

dependencies:
  stream_channel: ^2.1.0

dev_dependencies:
  lints: ^1.0.0
  test: ^1.16.0

executables:
  climatempo: climatempo

================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/.gitignore
================================================
# Files and directories created by pub.
.dart_tool/
.packages

# Conventional directory for build output.
build/


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/CHANGELOG.md
================================================
## 1.0.0

- Initial version.


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/README.md
================================================
A sample command-line application with an entrypoint in `bin/`, library code
in `lib/`, and example unit test in `test/`.


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/analysis_options.yaml
================================================
# This file configures the static analysis results for your project (errors,
# warnings, and lints).
#
# This enables the 'recommended' set of lints from `package:lints`.
# This set helps identify many issues that may lead to problems when running
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
# style and format.
#
# If you want a smaller set of lints you can change this to specify
# 'package:lints/core.yaml'. These are just the most critical lints
# (the recommended set includes the core lints).
# The core lints are also what is used by pub.dev for scoring packages.

include: package:lints/recommended.yaml

# Uncomment the following section to specify additional rules.

# linter:
#   rules:
#     - camel_case_types

# analyzer:
#   exclude:
#     - path/to/excluded/files/**

# For more information about the core and recommended set of lints, see
# https://dart.dev/go/core-lints

# For additional information about configuring this file, see
# https://dart.dev/guides/language/analysis-options


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/bin/climatempo.dart
================================================
import 'dart:async';
import 'dart:io';

import 'package:args/args.dart';
import 'package:climatempo/alerta_server.dart';
import 'package:climatempo/api.dart';
import 'package:climatempo/log.dart';
import 'package:climatempo/model/clima_tempo.dart';

void main(List<String> args) {
  runZonedGuarded(() {
    executar(args);
  }, (e, s) {
    print(e);
    print(s);
    salvarErro(e, s);
  });
}

Future<void> executar(List<String> args) async {
  final parser = criarParser();
  final argsResult = parser.parse(args);

  if (argsResult['help']) {
    mostrarAjuda(parser);
    exit(0);
  }

  final comando = argsResult.command;
  if (comando != null && comando.name == 'cidade') {
    final nomeCidade = comando['nome'];
    final estado = comando['estado'];
    final cidades = await buscarCidades(estado: estado, nome: nomeCidade);
    if (comando['salvar']) await salvarCidadesIsolate(cidades);
    cidades.forEach((c) => print(c));
  }

  if (comando != null && comando.name == 'agora') {
    final id = comando['id'];
    if (id == null) {
      print('É obrigatório informar um [-id] de cidade');
      exit(2);
    }
    final tempo = await registrarCidadeEBuscarTempo(int.parse(id));
    if (comando['salvar']) await salvarTempoIsolate(tempo);
    print(tempo);
  }

  if (comando != null && comando.name == 'alerta') {
    AlertaServer().start().listen(print);
  }
}

Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {
  await registrarCidade(idCidade: idCidade);
  return await climaAtual(idCidade: idCidade);
}

void mostrarAjuda(ArgParser parser) {
  print('--- HELP ---');
  print(parser.usage);
  for (var comando in parser.commands.entries) {
    print('> Comando [${comando.key}]');
    print(comando.value.usage);
  }
}

ArgParser criarParser() {
  return ArgParser()
    ..addCommand('alerta')
    ..addCommand(
      'cidade',
      ArgParser()
        ..addOption('nome',
            abbr: 'n', valueHelp: 'Nome da cidade para consulta')
        ..addOption('estado',
            abbr: 'e', valueHelp: 'Sigla do estado para consulta')
        ..addFlag('salvar',
            abbr: 's',
            help: 'Salvar o resultado em arquivo de log',
            negatable: false),
    )
    ..addCommand(
      'agora',
      ArgParser()
        ..addOption('id',
            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')
        ..addFlag('salvar',
            abbr: 's',
            help: 'Salvar o resultado em arquivo de log',
            negatable: false),
    )
    ..addFlag('help',
        abbr: 'h', help: 'Como utilizar o programa', negatable: false);
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/alerta_server.dart
================================================
import 'dart:convert';
import 'dart:io';

class AlertaServer {
  Stream<String> start() async* {
    var server = await HttpServer.bind(
      InternetAddress.loopbackIPv4,
      8080,
    );
    await for (HttpRequest request in server) {
      final contentType = request.headers.contentType != null
          ? request.headers.contentType!.mimeType : '';
      final response = request.response;

      if (request.method == 'POST'
          && contentType == 'application/json') {
        final requestMap = await utf8.decoder.bind(request).join();
        final String? aviso = jsonDecode(requestMap)['aviso'];
        if (aviso != null) {
          response
            ..statusCode = HttpStatus.ok
            ..write('Informação recebida!');
          yield aviso;
        } else {
          response
            ..statusCode = HttpStatus.badRequest
            ..write('Formato de request errado..');
        }
      } else {
        response
          ..statusCode = HttpStatus.methodNotAllowed
          ..write('É aceito apenas request POST');
      }
      await request.response.close();
    }
  }
}

================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/api.dart
================================================
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'model/cidade.dart';
import 'model/clima_tempo.dart';

const apiBaseUrl = 'https://apiadvisor.climatempo.com.br';
const token = '5e411a25e4adf6786d3fd7fa45d9fa9c';

Future<List<Cidade>> buscarCidades({String? nome, String? estado}) async {
  var url = '$apiBaseUrl/api/v1/locale/city?';
  if (nome != null) url += 'name=$nome';
  if (estado != null) url += '&state=$estado';

  final response = await http.get(Uri.parse('$url&token=$token'));
  if (response.statusCode != 200) throw response.body;
  final responseJson = json.decode(response.body);

  final cidades = <Cidade>[];
  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));
  return cidades;
}

Future<void> registrarCidade({required int idCidade}) async {
  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';
  final map = {'localeId[]': '$idCidade'};
  await http.put(Uri.parse(url), body: map);
}

Future<ClimaTempo> climaAtual({required int idCidade}) async {
  final url =
      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';
  final response = await http.get(Uri.parse(url));

  if (response.statusCode != 200) throw response.body;
  final responseJson = json.decode(response.body);

  return ClimaTempo.fromJson(responseJson);
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/log.dart
================================================
import 'dart:async';
import 'dart:io';
import 'dart:isolate';

import 'package:climatempo/model/clima_tempo.dart';

import 'model/cidade.dart';

Future<void> _validarDiretorio({String? dirPath}) async {
  final dir = Directory(dirPath ?? 'log');
  if (!(await dir.exists())) {
    await dir.create(recursive: true);
  }
}

Future<void> salvarTempoIsolate(ClimaTempo climaTempo) async {
  final isolate = await Isolate.spawn(salvarTempo, climaTempo);
  _registrarCallbackFinalizacao(isolate);
}

Future<void> salvarTempo(ClimaTempo climaTempo) async {
  runZonedGuarded(() async {
    await _validarDiretorio(dirPath: 'log/clima/');
    final file = File('log/clima/${climaTempo.cidade.id}.txt');
    await file.writeAsString('===\n$climaTempo', mode: FileMode.append);
  }, (e, s) {
    print(e);
    print(s);
    salvarErro(e, s, fileName: 'io/io.txt');
  });
}

void _registrarCallbackFinalizacao(Isolate isolate) {
  final receivePort = ReceivePort();
  receivePort.listen((mensagem) {
    print(mensagem);
    receivePort.close();
  });
  isolate.addOnExitListener(receivePort.sendPort,
      response: 'Arquivo salvo com sucesso!');
}

Future<void> salvarCidadesIsolate(List<Cidade> cidades) async {
  final isolate = await Isolate.spawn(salvarCidades, cidades);
  _registrarCallbackFinalizacao(isolate);
}

Future<void> salvarCidades(List<Cidade> cidades) async {
  runZonedGuarded(() async {
    await _validarDiretorio();
    final file = File('log/cidades.txt');
    final sink = file.openWrite(mode: FileMode.write);
    cidades.forEach((c) => sink.writeln(c));
    await sink.flush();
    await sink.close();
  }, (e, s) {
    print(e);
    print(s);
    salvarErro(e, s, fileName: 'io/io.txt');
  });
}

Future<void> salvarErro(Object erro, StackTrace stackTrace,
    {String? fileName}) async {
  final data = DateTime.now();
  final ano = data.year;
  final mes = _doisDigitos(data.month);
  final dia = _doisDigitos(data.day);
  final fileDir = 'log/erro/${fileName ?? '$dia$mes$ano.txt'}';

  await _validarDiretorio(dirPath: fileDir.split(RegExp(r'[^\/]+$')).first);
  final file = File(fileDir);

  await file.writeAsString('${data.toIso8601String()} : $erro\n',
      mode: FileMode.append);
  await file.writeAsString('${data.toIso8601String()} : $stackTrace',
      mode: FileMode.append);
}

String _doisDigitos(int numero) {
  if (numero >= 10) return '$numero';
  return '0$numero';
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/cidade.dart
================================================
class Cidade {
  Cidade.fromJson(Map<String, dynamic> jsonMap)
      : id = jsonMap['id'],
        nome = jsonMap['name'],
        estado = jsonMap['state'],
        pais = jsonMap['country'];
  final int id;
  final String nome;
  final String estado;
  final String pais;

  @override
  String toString() =>
      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/clima_tempo.dart
================================================
import 'cidade.dart';
import 'tempo.dart';

class ClimaTempo {
  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)
      : cidade = Cidade.fromJson(jsonMap),
        tempo = Tempo.fromJson(jsonMap['data']);
  final Cidade cidade;
  final Tempo tempo;

  String toString() => '''
Cidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}
${tempo.data}
Temperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}
Umidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}
''';
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/tempo.dart
================================================
class Tempo {
  Tempo.fromJson(Map<String, dynamic> jsonMap)
      : temperatura = jsonMap['temperature'],
        velocidadeVento = jsonMap['wind_velocity'],
        humidade = jsonMap['humidity'],
        sensacao = jsonMap['sensation'],
        data = DateTime.parse(jsonMap['date']);
  final num temperatura;
  final num velocidadeVento;
  final num humidade;
  final num sensacao;
  final DateTime data;
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/cidades.txt
================================================
Id:  5049  -  Nome:  Abdon Batista  -  Estado:  SC, País:  BR  
Id:  5050  -  Nome:  Abelardo Luz  -  Estado:  SC, País:  BR  
Id:  5051  -  Nome:  Agrolândia  -  Estado:  SC, País:  BR  
Id:  5052  -  Nome:  Agronômica  -  Estado:  SC, País:  BR  
Id:  5053  -  Nome:  Água Doce  -  Estado:  SC, País:  BR  
Id:  5054  -  Nome:  Águas Brancas  -  Estado:  SC, País:  BR  
Id:  5055  -  Nome:  Águas de Chapecó  -  Estado:  SC, País:  BR  
Id:  5056  -  Nome:  Águas Frias  -  Estado:  SC, País:  BR  
Id:  5057  -  Nome:  Águas Mornas  -  Estado:  SC, País:  BR  
Id:  5058  -  Nome:  Alfredo Wagner  -  Estado:  SC, País:  BR  
Id:  5059  -  Nome:  Alto Bela Vista  -  Estado:  SC, País:  BR  
Id:  5060  -  Nome:  Anchieta  -  Estado:  SC, País:  BR  
Id:  5061  -  Nome:  Angelina  -  Estado:  SC, País:  BR  
Id:  5062  -  Nome:  Anita Garibaldi  -  Estado:  SC, País:  BR  
Id:  5063  -  Nome:  Anitápolis  -  Estado:  SC, País:  BR  
Id:  5064  -  Nome:  Anta Gorda  -  Estado:  SC, País:  BR  
Id:  5065  -  Nome:  Antônio Carlos  -  Estado:  SC, País:  BR  
Id:  5066  -  Nome:  Apiúna  -  Estado:  SC, País:  BR  
Id:  5067  -  Nome:  Arabutã  -  Estado:  SC, País:  BR  
Id:  5068  -  Nome:  Araquari  -  Estado:  SC, País:  BR  
Id:  5069  -  Nome:  Araranguá  -  Estado:  SC, País:  BR  
Id:  5070  -  Nome:  Armazém  -  Estado:  SC, País:  BR  
Id:  5071  -  Nome:  Arroio Trinta  -  Estado:  SC, País:  BR  
Id:  5072  -  Nome:  Arvoredo  -  Estado:  SC, País:  BR  
Id:  5073  -  Nome:  Ascurra  -  Estado:  SC, País:  BR  
Id:  5074  -  Nome:  Atalanta  -  Estado:  SC, País:  BR  
Id:  5075  -  Nome:  Aurora  -  Estado:  SC, País:  BR  
Id:  5076  -  Nome:  Balneário Arroio do Silva  -  Estado:  SC, País:  BR  
Id:  5077  -  Nome:  Balneário Barra do Sul  -  Estado:  SC, País:  BR  
Id:  5078  -  Nome:  Balneário Camboriú  -  Estado:  SC, País:  BR  
Id:  5080  -  Nome:  Balneário Gaivota  -  Estado:  SC, País:  BR  
Id:  4769  -  Nome:  Balneário Piçarras  -  Estado:  SC, País:  BR  
Id:  5081  -  Nome:  Bandeirante  -  Estado:  SC, País:  BR  
Id:  5082  -  Nome:  Barra Bonita  -  Estado:  SC, País:  BR  
Id:  5083  -  Nome:  Barra do Ibiraquera  -  Estado:  SC, País:  BR  
Id:  5084  -  Nome:  Barra do Saí  -  Estado:  SC, País:  BR  
Id:  5085  -  Nome:  Barra Velha  -  Estado:  SC, País:  BR  
Id:  5086  -  Nome:  Bela Vista do Toldo  -  Estado:  SC, País:  BR  
Id:  5087  -  Nome:  Belmonte  -  Estado:  SC, País:  BR  
Id:  5088  -  Nome:  Benedito Novo  -  Estado:  SC, País:  BR  
Id:  5089  -  Nome:  Biguaçu  -  Estado:  SC, País:  BR  
Id:  5090  -  Nome:  Blumenau  -  Estado:  SC, País:  BR  
Id:  5091  -  Nome:  Bocaina do Sul  -  Estado:  SC, País:  BR  
Id:  5092  -  Nome:  Bombinhas  -  Estado:  SC, País:  BR  
Id:  5093  -  Nome:  Bom Jardim da Serra  -  Estado:  SC, País:  BR  
Id:  5095  -  Nome:  Bom Jesus  -  Estado:  SC, País:  BR  
Id:  5094  -  Nome:  Bom Jesus do Oeste  -  Estado:  SC, País:  BR  
Id:  5096  -  Nome:  Bom Retiro  -  Estado:  SC, País:  BR  
Id:  5097  -  Nome:  Bom Sucesso  -  Estado:  SC, País:  BR  
Id:  5098  -  Nome:  Botuverá  -  Estado:  SC, País:  BR  
Id:  5099  -  Nome:  Braço do Norte  -  Estado:  SC, País:  BR  
Id:  5100  -  Nome:  Braço do Trombudo  -  Estado:  SC, País:  BR  
Id:  5101  -  Nome:  Brunópolis  -  Estado:  SC, País:  BR  
Id:  5102  -  Nome:  Brusque  -  Estado:  SC, País:  BR  
Id:  5103  -  Nome:  Caçador  -  Estado:  SC, País:  BR  
Id:  5104  -  Nome:  Caibi  -  Estado:  SC, País:  BR  
Id:  5105  -  Nome:  Calmon  -  Estado:  SC, País:  BR  
Id:  5106  -  Nome:  Camboriú  -  Estado:  SC, País:  BR  
Id:  5107  -  Nome:  Campina da Alegria  -  Estado:  SC, País:  BR  
Id:  5108  -  Nome:  Campo Alegre  -  Estado:  SC, País:  BR  
Id:  5109  -  Nome:  Campo Belo do Sul  -  Estado:  SC, País:  BR  
Id:  5110  -  Nome:  Campo Erê  -  Estado:  SC, País:  BR  
Id:  5111  -  Nome:  Campos Novos  -  Estado:  SC, País:  BR  
Id:  5112  -  Nome:  Canelinha  -  Estado:  SC, País:  BR  
Id:  5113  -  Nome:  Canoinhas  -  Estado:  SC, País:  BR  
Id:  5114  -  Nome:  Capão Alto  -  Estado:  SC, País:  BR  
Id:  5115  -  Nome:  Capinzal  -  Estado:  SC, País:  BR  
Id:  5116  -  Nome:  Capivari de Baixo  -  Estado:  SC, País:  BR  
Id:  5117  -  Nome:  Catanduvas  -  Estado:  SC, País:  BR  
Id:  5118  -  Nome:  Caxambu do Sul  -  Estado:  SC, País:  BR  
Id:  5119  -  Nome:  Celso Ramos  -  Estado:  SC, País:  BR  
Id:  4888  -  Nome:  Cerro Negro  -  Estado:  SC, País:  BR  
Id:  4889  -  Nome:  Chapadão do Lageado  -  Estado:  SC, País:  BR  
Id:  4890  -  Nome:  Chapecó  -  Estado:  SC, País:  BR  
Id:  4891  -  Nome:  Cocal do Sul  -  Estado:  SC, País:  BR  
Id:  4892  -  Nome:  Concórdia  -  Estado:  SC, País:  BR  
Id:  4893  -  Nome:  Cordilheira Alta  -  Estado:  SC, País:  BR  
Id:  4894  -  Nome:  Coronel Freitas  -  Estado:  SC, País:  BR  
Id:  4895  -  Nome:  Coronel Martins  -  Estado:  SC, País:  BR  
Id:  4896  -  Nome:  Correia Pinto  -  Estado:  SC, País:  BR  
Id:  4897  -  Nome:  Corupá  -  Estado:  SC, País:  BR  
Id:  4898  -  Nome:  Criciúma  -  Estado:  SC, País:  BR  
Id:  4899  -  Nome:  Cunha Porã  -  Estado:  SC, País:  BR  
Id:  4900  -  Nome:  Cunhataí  -  Estado:  SC, País:  BR  
Id:  4901  -  Nome:  Curitibanos  -  Estado:  SC, País:  BR  
Id:  4902  -  Nome:  Descanso  -  Estado:  SC, País:  BR  
Id:  4903  -  Nome:  Dionísio Cerqueira  -  Estado:  SC, País:  BR  
Id:  4904  -  Nome:  Dona Emma  -  Estado:  SC, País:  BR  
Id:  4905  -  Nome:  Doutor Pedrinho  -  Estado:  SC, País:  BR  
Id:  4906  -  Nome:  Enseada de Brito  -  Estado:  SC, País:  BR  
Id:  4907  -  Nome:  Entre Rios  -  Estado:  SC, País:  BR  
Id:  4909  -  Nome:  Ermo  -  Estado:  SC, País:  BR  
Id:  4912  -  Nome:  Erval Velho  -  Estado:  SC, País:  BR  
Id:  4913  -  Nome:  Faxinal dos Guedes  -  Estado:  SC, País:  BR  
Id:  4914  -  Nome:  Flor do Sertão  -  Estado:  SC, País:  BR  
Id:  4915  -  Nome:  Florianópolis  -  Estado:  SC, País:  BR  
Id:  4916  -  Nome:  Formosa do Sul  -  Estado:  SC, País:  BR  
Id:  4918  -  Nome:  Forquilhinha  -  Estado:  SC, País:  BR  
Id:  4919  -  Nome:  Fraiburgo  -  Estado:  SC, País:  BR  
Id:  4920  -  Nome:  Frei Rogério  -  Estado:  SC, País:  BR  
Id:  4921  -  Nome:  Galvão  -  Estado:  SC, País:  BR  
Id:  4922  -  Nome:  Garopaba  -  Estado:  SC, País:  BR  
Id:  4923  -  Nome:  Garuva  -  Estado:  SC, País:  BR  
Id:  4924  -  Nome:  Gaspar  -  Estado:  SC, País:  BR  
Id:  4925  -  Nome:  Governador Celso Ramos  -  Estado:  SC, País:  BR  
Id:  4927  -  Nome:  Grão Pará  -  Estado:  SC, País:  BR  
Id:  4928  -  Nome:  Gravatal  -  Estado:  SC, País:  BR  
Id:  4929  -  Nome:  Guabiruba  -  Estado:  SC, País:  BR  
Id:  4930  -  Nome:  Guaraciaba  -  Estado:  SC, País:  BR  
Id:  4931  -  Nome:  Guaramirim  -  Estado:  SC, País:  BR  
Id:  4932  -  Nome:  Guarda do Embaú  -  Estado:  SC, País:  BR  
Id:  4933  -  Nome:  Guarujá do Sul  -  Estado:  SC, País:  BR  
Id:  4935  -  Nome:  Guatá  -  Estado:  SC, País:  BR  
Id:  4934  -  Nome:  Guatambú  -  Estado:  SC, País:  BR  
Id:  4936  -  Nome:  Herval d'Oeste  -  Estado:  SC, País:  BR  
Id:  4937  -  Nome:  Ibiam  -  Estado:  SC, País:  BR  
Id:  4938  -  Nome:  Ibicaré  -  Estado:  SC, País:  BR  
Id:  4939  -  Nome:  Ibirama  -  Estado:  SC, País:  BR  
Id:  4940  -  Nome:  Içara  -  Estado:  SC, País:  BR  
Id:  4941  -  Nome:  Ilhota  -  Estado:  SC, País:  BR  
Id:  4942  -  Nome:  Imaruí  -  Estado:  SC, País:  BR  
Id:  4943  -  Nome:  Imbituba  -  Estado:  SC, País:  BR  
Id:  4944  -  Nome:  Imbuia  -  Estado:  SC, País:  BR  
Id:  4945  -  Nome:  Indaial  -  Estado:  SC, País:  BR  
Id:  4946  -  Nome:  Iomerê  -  Estado:  SC, País:  BR  
Id:  4947  -  Nome:  Ipira  -  Estado:  SC, País:  BR  
Id:  4948  -  Nome:  Ipoméia  -  Estado:  SC, País:  BR  
Id:  4949  -  Nome:  Iporã do Oeste  -  Estado:  SC, País:  BR  
Id:  4950  -  Nome:  Ipuaçu  -  Estado:  SC, País:  BR  
Id:  4951  -  Nome:  Ipumirim  -  Estado:  SC, País:  BR  
Id:  4952  -  Nome:  Iraceminha  -  Estado:  SC, País:  BR  
Id:  4953  -  Nome:  Irani  -  Estado:  SC, País:  BR  
Id:  4954  -  Nome:  Irati  -  Estado:  SC, País:  BR  
Id:  4955  -  Nome:  Irineópolis  -  Estado:  SC, País:  BR  
Id:  4962  -  Nome:  Itá  -  Estado:  SC, País:  BR  
Id:  4956  -  Nome:  Itaiópolis  -  Estado:  SC, País:  BR  
Id:  4957  -  Nome:  Itajaí  -  Estado:  SC, País:  BR  
Id:  4958  -  Nome:  Itapema  -  Estado:  SC, País:  BR  
Id:  4959  -  Nome:  Itapiranga  -  Estado:  SC, País:  BR  
Id:  4960  -  Nome:  Itapoá  -  Estado:  SC, País:  BR  
Id:  4961  -  Nome:  Itapocu  -  Estado:  SC, País:  BR  
Id:  4963  -  Nome:  Ituporanga  -  Estado:  SC, País:  BR  
Id:  4964  -  Nome:  Jaborá  -  Estado:  SC, País:  BR  
Id:  4965  -  Nome:  Jacinto Machado  -  Estado:  SC, País:  BR  
Id:  4966  -  Nome:  Jaguaruna  -  Estado:  SC, País:  BR  
Id:  4967  -  Nome:  Jaraguá do Sul  -  Estado:  SC, País:  BR  
Id:  4968  -  Nome:  Jardinópolis  -  Estado:  SC, País:  BR  
Id:  4969  -  Nome:  Joaçaba  -  Estado:  SC, País:  BR  
Id:  4970  -  Nome:  Joinville  -  Estado:  SC, País:  BR  
Id:  4971  -  Nome:  José Boiteux  -  Estado:  SC, País:  BR  
Id:  4972  -  Nome:  Jupiá  -  Estado:  SC, País:  BR  
Id:  4974  -  Nome:  Lacerdópolis  -  Estado:  SC, País:  BR  
Id:  4975  -  Nome:  Lages  -  Estado:  SC, País:  BR  
Id:  4976  -  Nome:  Laguna  -  Estado:  SC, País:  BR  
Id:  4977  -  Nome:  Lajeado Grande  -  Estado:  SC, País:  BR  
Id:  4978  -  Nome:  Laurentino  -  Estado:  SC, País:  BR  
Id:  4979  -  Nome:  Lauro Muller  -  Estado:  SC, País:  BR  
Id:  4980  -  Nome:  Lebon Régis  -  Estado:  SC, País:  BR  
Id:  4981  -  Nome:  Leoberto Leal  -  Estado:  SC, País:  BR  
Id:  4982  -  Nome:  Lindóia do Sul  -  Estado:  SC, País:  BR  
Id:  4983  -  Nome:  Lontras  -  Estado:  SC, País:  BR  
Id:  4984  -  Nome:  Luiz Alves  -  Estado:  SC, País:  BR  
Id:  4985  -  Nome:  Luzerna  -  Estado:  SC, País:  BR  
Id:  4986  -  Nome:  Macieira  -  Estado:  SC, País:  BR  
Id:  4987  -  Nome:  Mafra  -  Estado:  SC, País:  BR  
Id:  4988  -  Nome:  Major Gercino  -  Estado:  SC, País:  BR  
Id:  4989  -  Nome:  Major Vieira  -  Estado:  SC, País:  BR  
Id:  4990  -  Nome:  Maracajá  -  Estado:  SC, País:  BR  
Id:  4991  -  Nome:  Maravilha  -  Estado:  SC, País:  BR  
Id:  4992  -  Nome:  Marema  -  Estado:  SC, País:  BR  
Id:  4993  -  Nome:  Massaranduba  -  Estado:  SC, País:  BR  
Id:  4994  -  Nome:  Matos Costa  -  Estado:  SC, País:  BR  
Id:  4995  -  Nome:  Meleiro  -  Estado:  SC, País:  BR  
Id:  4996  -  Nome:  Mirim Doce  -  Estado:  SC, País:  BR  
Id:  4997  -  Nome:  Modelo  -  Estado:  SC, País:  BR  
Id:  4998  -  Nome:  Mondaí  -  Estado:  SC, País:  BR  
Id:  4999  -  Nome:  Monte Carlo  -  Estado:  SC, País:  BR  
Id:  5000  -  Nome:  Monte Castelo  -  Estado:  SC, País:  BR  
Id:  5001  -  Nome:  Morro da Fumaça  -  Estado:  SC, País:  BR  
Id:  5002  -  Nome:  Morro Grande  -  Estado:  SC, País:  BR  
Id:  5003  -  Nome:  Navegantes  -  Estado:  SC, País:  BR  
Id:  5004  -  Nome:  Nova Erechim  -  Estado:  SC, País:  BR  
Id:  5005  -  Nome:  Nova Itaberaba  -  Estado:  SC, País:  BR  
Id:  5006  -  Nome:  Nova Trento  -  Estado:  SC, País:  BR  
Id:  5007  -  Nome:  Nova Veneza  -  Estado:  SC, País:  BR  
Id:  4678  -  Nome:  Novo Horizonte  -  Estado:  SC, País:  BR  
Id:  4679  -  Nome:  Orleans  -  Estado:  SC, País:  BR  
Id:  4680  -  Nome:  Otacílio Costa  -  Estado:  SC, País:  BR  
Id:  4681  -  Nome:  Ouro  -  Estado:  SC, País:  BR  
Id:  4682  -  Nome:  Ouro Verde  -  Estado:  SC, País:  BR  
Id:  4683  -  Nome:  Paial  -  Estado:  SC, País:  BR  
Id:  4648  -  Nome:  Painel  -  Estado:  SC, País:  BR  
Id:  4756  -  Nome:  Palhoça  -  Estado:  SC, País:  BR  
Id:  4757  -  Nome:  Palma Sola  -  Estado:  SC, País:  BR  
Id:  4758  -  Nome:  Palmeira  -  Estado:  SC, País:  BR  
Id:  4759  -  Nome:  Palmitos  -  Estado:  SC, País:  BR  
Id:  4760  -  Nome:  Papanduva  -  Estado:  SC, País:  BR  
Id:  4761  -  Nome:  Paraíso  -  Estado:  SC, País:  BR  
Id:  4762  -  Nome:  Passo de Torres  -  Estado:  SC, País:  BR  
Id:  4763  -  Nome:  Passos Maia  -  Estado:  SC, País:  BR  
Id:  4764  -  Nome:  Paulo Lopes  -  Estado:  SC, País:  BR  
Id:  4765  -  Nome:  Pedras Grandes  -  Estado:  SC, País:  BR  
Id:  4766  -  Nome:  Penha  -  Estado:  SC, País:  BR  
Id:  4767  -  Nome:  Peritiba  -  Estado:  SC, País:  BR  
Id:  4768  -  Nome:  Petrolândia  -  Estado:  SC, País:  BR  
Id:  4770  -  Nome:  Pinhalzinho  -  Estado:  SC, País:  BR  
Id:  4771  -  Nome:  Pinheiro Preto  -  Estado:  SC, País:  BR  
Id:  4772  -  Nome:  Piratuba  -  Estado:  SC, País:  BR  
Id:  4773  -  Nome:  Planalto Alegre  -  Estado:  SC, País:  BR  
Id:  4774  -  Nome:  Pomerode  -  Estado:  SC, País:  BR  
Id:  4776  -  Nome:  Ponte Alta  -  Estado:  SC, País:  BR  
Id:  4775  -  Nome:  Ponte Alta do Norte  -  Estado:  SC, País:  BR  
Id:  4777  -  Nome:  Ponte Serrada  -  Estado:  SC, País:  BR  
Id:  4778  -  Nome:  Porto Belo  -  Estado:  SC, País:  BR  
Id:  4779  -  Nome:  Porto União  -  Estado:  SC, País:  BR  
Id:  4780  -  Nome:  Pouso Redondo  -  Estado:  SC, País:  BR  
Id:  4781  -  Nome:  Praia do Santinho  -  Estado:  SC, País:  BR  
Id:  4782  -  Nome:  Praia Grande  -  Estado:  SC, País:  BR  
Id:  4783  -  Nome:  Presidente Castelo Branco  -  Estado:  SC, País:  BR  
Id:  4784  -  Nome:  Presidente Getúlio  -  Estado:  SC, País:  BR  
Id:  4785  -  Nome:  Presidente Nereu  -  Estado:  SC, País:  BR  
Id:  4811  -  Nome:  Princesa  -  Estado:  SC, País:  BR  
Id:  4812  -  Nome:  Quilombo  -  Estado:  SC, País:  BR  
Id:  4813  -  Nome:  Rancho Queimado  -  Estado:  SC, País:  BR  
Id:  4814  -  Nome:  Rio das Antas  -  Estado:  SC, País:  BR  
Id:  4815  -  Nome:  Rio do Campo  -  Estado:  SC, País:  BR  
Id:  4816  -  Nome:  Rio d'Oeste  -  Estado:  SC, País:  BR  
Id:  4817  -  Nome:  Rio dos Cedros  -  Estado:  SC, País:  BR  
Id:  4818  -  Nome:  Rio do Sul  -  Estado:  SC, País:  BR  
Id:  4819  -  Nome:  Rio Fortuna  -  Estado:  SC, País:  BR  
Id:  4820  -  Nome:  Rio Negrinho  -  Estado:  SC, País:  BR  
Id:  4821  -  Nome:  Rio Rufino  -  Estado:  SC, País:  BR  
Id:  4822  -  Nome:  Riqueza  -  Estado:  SC, País:  BR  
Id:  4823  -  Nome:  Rodeio  -  Estado:  SC, País:  BR  
Id:  4824  -  Nome:  Romelândia  -  Estado:  SC, País:  BR  
Id:  4825  -  Nome:  Salete  -  Estado:  SC, País:  BR  
Id:  4826  -  Nome:  Saltinho  -  Estado:  SC, País:  BR  
Id:  4827  -  Nome:  Salto Veloso  -  Estado:  SC, País:  BR  
Id:  4828  -  Nome:  Sangão  -  Estado:  SC, País:  BR  
Id:  4829  -  Nome:  Santa Cecília  -  Estado:  SC, País:  BR  
Id:  4830  -  Nome:  Santa Helena  -  Estado:  SC, País:  BR  
Id:  4831  -  Nome:  Santa Rosa de Lima  -  Estado:  SC, País:  BR  
Id:  4832  -  Nome:  Santa Rosa do Sul  -  Estado:  SC, País:  BR  
Id:  4834  -  Nome:  Santa Terezinha  -  Estado:  SC, País:  BR  
Id:  4833  -  Nome:  Santa Terezinha do Progresso  -  Estado:  SC, País:  BR  
Id:  4835  -  Nome:  Santiago do Sul  -  Estado:  SC, País:  BR  
Id:  4836  -  Nome:  Santo Amaro da Imperatriz  -  Estado:  SC, País:  BR  
Id:  4837  -  Nome:  São Bento do Sul  -  Estado:  SC, País:  BR  
Id:  4838  -  Nome:  São Bernardino  -  Estado:  SC, País:  BR  
Id:  4839  -  Nome:  São Bonifácio  -  Estado:  SC, País:  BR  
Id:  4840  -  Nome:  São Carlos  -  Estado:  SC, País:  BR  
Id:  4841  -  Nome:  São Cristovão do Sul  -  Estado:  SC, País:  BR  
Id:  4842  -  Nome:  São Domingos  -  Estado:  SC, País:  BR  
Id:  4843  -  Nome:  São Francisco do Sul  -  Estado:  SC, País:  BR  
Id:  4844  -  Nome:  São João Batista  -  Estado:  SC, País:  BR  
Id:  4845  -  Nome:  São João do Itaperiú  -  Estado:  SC, País:  BR  
Id:  4846  -  Nome:  São João do Oeste  -  Estado:  SC, País:  BR  
Id:  4847  -  Nome:  São João do Sul  -  Estado:  SC, País:  BR  
Id:  4848  -  Nome:  São Joaquim  -  Estado:  SC, País:  BR  
Id:  4851  -  Nome:  São José  -  Estado:  SC, País:  BR  
Id:  4849  -  Nome:  São José do Cedro  -  Estado:  SC, País:  BR  
Id:  4850  -  Nome:  São José do Cerrito  -  Estado:  SC, País:  BR  
Id:  4852  -  Nome:  São Lourenço d'Oeste  -  Estado:  SC, País:  BR  
Id:  4853  -  Nome:  São Ludgero  -  Estado:  SC, País:  BR  
Id:  4854  -  Nome:  São Martinho  -  Estado:  SC, País:  BR  
Id:  4855  -  Nome:  São Miguel da Boa Vista  -  Estado:  SC, País:  BR  
Id:  4856  -  Nome:  São Miguel do Oeste  -  Estado:  SC, País:  BR  
Id:  4857  -  Nome:  São Pedro de Alcântara  -  Estado:  SC, País:  BR  
Id:  4858  -  Nome:  Saudades  -  Estado:  SC, País:  BR  
Id:  85793  -  Nome:  SBCH  -  Estado:  SC, País:  BR  
Id:  74832  -  Nome:  SBFL  -  Estado:  SC, País:  BR  
Id:  74833  -  Nome:  SBJV  -  Estado:  SC, País:  BR  
Id:  85285  -  Nome:  SBNF  -  Estado:  SC, País:  BR  
Id:  4859  -  Nome:  Schroeder  -  Estado:  SC, País:  BR  
Id:  4860  -  Nome:  Seara  -  Estado:  SC, País:  BR  
Id:  4861  -  Nome:  Serra Alta  -  Estado:  SC, País:  BR  
Id:  4862  -  Nome:  Siderópolis  -  Estado:  SC, País:  BR  
Id:  4863  -  Nome:  Sombrio  -  Estado:  SC, País:  BR  
Id:  4864  -  Nome:  Sul Brasil  -  Estado:  SC, País:  BR  
Id:  4865  -  Nome:  Taió  -  Estado:  SC, País:  BR  
Id:  4866  -  Nome:  Tangará  -  Estado:  SC, País:  BR  
Id:  4867  -  Nome:  Tigrinhos  -  Estado:  SC, País:  BR  
Id:  4868  -  Nome:  Tijucas  -  Estado:  SC, País:  BR  
Id:  4869  -  Nome:  Timbé do Sul  -  Estado:  SC, País:  BR  
Id:  4871  -  Nome:  Timbó  -  Estado:  SC, País:  BR  
Id:  4870  -  Nome:  Timbó Grande  -  Estado:  SC, País:  BR  
Id:  4872  -  Nome:  Três Barras  -  Estado:  SC, País:  BR  
Id:  4875  -  Nome:  Treviso  -  Estado:  SC, País:  BR  
Id:  4878  -  Nome:  Treze de Maio  -  Estado:  SC, País:  BR  
Id:  4879  -  Nome:  Treze Tílias  -  Estado:  SC, País:  BR  
Id:  4880  -  Nome:  Trombudo Central  -  Estado:  SC, País:  BR  
Id:  4881  -  Nome:  Tubarão  -  Estado:  SC, País:  BR  
Id:  4882  -  Nome:  Tunápolis  -  Estado:  SC, País:  BR  
Id:  4883  -  Nome:  Turvo  -  Estado:  SC, País:  BR  
Id:  4884  -  Nome:  União do Oeste  -  Estado:  SC, País:  BR  
Id:  4885  -  Nome:  Urubici  -  Estado:  SC, País:  BR  
Id:  4886  -  Nome:  Urupema  -  Estado:  SC, País:  BR  
Id:  4887  -  Nome:  Urussanga  -  Estado:  SC, País:  BR  
Id:  4482  -  Nome:  Vargeão  -  Estado:  SC, País:  BR  
Id:  4484  -  Nome:  Vargem  -  Estado:  SC, País:  BR  
Id:  4483  -  Nome:  Vargem Bonita  -  Estado:  SC, País:  BR  
Id:  4485  -  Nome:  Vidal Ramos  -  Estado:  SC, País:  BR  
Id:  4486  -  Nome:  Videira  -  Estado:  SC, País:  BR  
Id:  4487  -  Nome:  Vitor Meireles  -  Estado:  SC, País:  BR  
Id:  4488  -  Nome:  Witmarsum  -  Estado:  SC, País:  BR  
Id:  4489  -  Nome:  Xanxerê  -  Estado:  SC, País:  BR  
Id:  4490  -  Nome:  Xavantina  -  Estado:  SC, País:  BR  
Id:  4491  -  Nome:  Xaxim  -  Estado:  SC, País:  BR  
Id:  4492  -  Nome:  Zortéa  -  Estado:  SC, País:  BR  


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/clima/4915.txt
================================================
===
Cidade:  Florianópolis,  SC  -  BR  
2022-03-13 23:11:47.000
Temperatura:  20  -  Sensação:  20
Umidade:  100  -  Velocidade  do  Vento:  15


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/erro/io/io.txt
================================================
2022-03-13T23:13:23.420404 : Erro ao salvar o tempo no arquivo
2022-03-13T23:13:23.420404 : #0      salvarTempo.<anonymous closure> (package:climatempo/log.dart:24:5)
#1      salvarTempo.<anonymous closure> (package:climatempo/log.dart:23:19)
#2      _rootRun (dart:async/zone.dart:1426:13)
#3      _CustomZone.run (dart:async/zone.dart:1328:19)
#4      _runZoned (dart:async/zone.dart:1861:10)
#5      runZonedGuarded (dart:async/zone.dart:1849:12)
#6      salvarTempo (package:climatempo/log.dart:23:3)
#7      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:300:17)
#8      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
2022-03-13T23:14:29.744959 : FileSystemException: Cannot open file, path = 'log/clima/4915.txt' (OS Error: No such file or directory, errno = 2)
2022-03-13T23:14:29.744959 : #0      _File.open.<anonymous closure> (dart:io/file_impl.dart:356:9)
#1      _rootRunUnary (dart:async/zone.dart:1434:47)
#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
<asynchronous suspension>
#3      salvarTempo.<anonymous closure> (package:climatempo/log.dart:25:5)
<asynchronous suspension>


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/pubspec.yaml
================================================
name: climatempo
description: Aplicação CLI para consulta de clima.
version: 0.0.1

environment:
  sdk: ^3.5.1

dependencies:
  args: ^2.4.2
  http: ^1.2.2

dev_dependencies:
  lints: ^4.0.0
  test: ^1.24.0
  
executables:
  climatempo: climatempo

================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/.gitignore
================================================
# Files and directories created by pub.
.dart_tool/
.packages

# Conventional directory for build output.
build/


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/CHANGELOG.md
================================================
## 1.0.0

- Initial version.


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/README.md
================================================
A sample command-line application with an entrypoint in `bin/`, library code
in `lib/`, and example unit test in `test/`.


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/analysis_options.yaml
================================================
# This file configures the static analysis results for your project (errors,
# warnings, and lints).
#
# This enables the 'recommended' set of lints from `package:lints`.
# This set helps identify many issues that may lead to problems when running
# or consuming Dart code, and enforces writing Dart using a single, idiomatic
# style and format.
#
# If you want a smaller set of lints you can change this to specify
# 'package:lints/core.yaml'. These are just the most critical lints
# (the recommended set includes the core lints).
# The core lints are also what is used by pub.dev for scoring packages.

include: package:lints/recommended.yaml

# Uncomment the following section to specify additional rules.

# linter:
#   rules:
#     - camel_case_types

# analyzer:
#   exclude:
#     - path/to/excluded/files/**

# For more information about the core and recommended set of lints, see
# https://dart.dev/go/core-lints

# For additional information about configuring this file, see
# https://dart.dev/guides/language/analysis-options


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/bin/climatempo.dart
================================================
import 'dart:async';
import 'dart:io';

import 'package:args/args.dart';
import 'package:climatempo/alerta_server.dart';
import 'package:climatempo/api.dart';
import 'package:climatempo/log.dart';
import 'package:climatempo/model/clima_tempo.dart';

void main(List<String> args) {
  runZonedGuarded(() {
    executar(args);
  }, (e, s) {
    print(e);
    print(s);
    salvarErro(e, s);
  });
}

Future<void> executar(List<String> args) async {
  final parser = criarParser();
  final argsResult = parser.parse(args);

  if (argsResult['help']) {
    mostrarAjuda(parser);
    exit(0);
  }

  final comando = argsResult.command;
  if (comando != null && comando.name == 'cidade') {
    final nomeCidade = comando['nome'];
    final estado = comando['estado'];
    final cidades = await buscarCidades(estado: estado, nome: nomeCidade);
    if (comando['salvar']) await salvarCidadesIsolate(cidades);
    cidades.forEach((c) => print(c));
  }

  if (comando != null && comando.name == 'agora') {
    final id = comando['id'];
    if (id == null) {
      print('É obrigatório informar um [-id] de cidade');
      exit(2);
    }
    final tempo = await registrarCidadeEBuscarTempo(int.parse(id));
    if (comando['salvar']) await salvarTempoIsolate(tempo);
    print(tempo);
  }

  if (comando != null && comando.name == 'alerta') {
    AlertaServer().start().listen(print);
  }
}

Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade) async {
  await registrarCidade(idCidade: idCidade);
  return await climaAtual(idCidade: idCidade);
}

void mostrarAjuda(ArgParser parser) {
  print('--- HELP ---');
  print(parser.usage);
  for (var comando in parser.commands.entries) {
    print('> Comando [${comando.key}]');
    print(comando.value.usage);
  }
}

ArgParser criarParser() {
  return ArgParser()
    ..addCommand('alerta')
    ..addCommand(
      'cidade',
      ArgParser()
        ..addOption('nome',
            abbr: 'n', valueHelp: 'Nome da cidade para consulta')
        ..addOption('estado',
            abbr: 'e', valueHelp: 'Sigla do estado para consulta')
        ..addFlag('salvar',
            abbr: 's',
            help: 'Salvar o resultado em arquivo de log',
            negatable: false),
    )
    ..addCommand(
      'agora',
      ArgParser()
        ..addOption('id',
            abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')
        ..addFlag('salvar',
            abbr: 's',
            help: 'Salvar o resultado em arquivo de log',
            negatable: false),
    )
    ..addFlag('help',
        abbr: 'h', help: 'Como utilizar o programa', negatable: false);
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/alerta_server.dart
================================================
import 'dart:convert';
import 'dart:io';

class AlertaServer {
  Stream<String> start() async* {
    var server = await HttpServer.bind(
      InternetAddress.loopbackIPv4,
      8080,
    );
    await for (HttpRequest request in server) {
      final contentType = request.headers.contentType != null
          ? request.headers.contentType!.mimeType : '';
      final response = request.response;

      if (request.method == 'POST'
          && contentType == 'application/json') {
        final requestMap = await utf8.decoder.bind(request).join();
        final String? aviso = jsonDecode(requestMap)['aviso'];
        if (aviso != null) {
          response
            ..statusCode = HttpStatus.ok
            ..write('Informação recebida!');
          yield aviso;
        } else {
          response
            ..statusCode = HttpStatus.badRequest
            ..write('Formato de request errado..');
        }
      } else {
        response
          ..statusCode = HttpStatus.methodNotAllowed
          ..write('É aceito apenas request POST');
      }
      await request.response.close();
    }
  }
}

================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/api.dart
================================================
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'model/cidade.dart';
import 'model/clima_tempo.dart';

const apiBaseUrl = 'https://apiadvisor.climatempo.com.br';
const token = '5e411a25e4adf6786d3fd7fa45d9fa9c';

Future<List<Cidade>> buscarCidades({String? nome, String? estado}) async {
  var url = '$apiBaseUrl/api/v1/locale/city?';
  if (nome != null) url += 'name=$nome';
  if (estado != null) url += '&state=$estado';

  final response = await http.get(Uri.parse('$url&token=$token'));
  if (response.statusCode != 200) throw response.body;
  final responseJson = json.decode(response.body);

  final cidades = <Cidade>[];
  responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));
  return cidades;
}

Future<void> registrarCidade({required int idCidade}) async {
  final url = '$apiBaseUrl/api-manager/user-token/$token/locales';
  final map = {'localeId[]': '$idCidade'};
  await http.put(Uri.parse(url), body: map);
}

Future<ClimaTempo> climaAtual({required int idCidade}) async {
  final url =
      '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token';
  final response = await http.get(Uri.parse(url));

  if (response.statusCode != 200) throw response.body;
  final responseJson = json.decode(response.body);

  return ClimaTempo.fromJson(responseJson);
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/log.dart
================================================
import 'dart:async';
import 'dart:io';
import 'dart:isolate';

import 'package:climatempo/model/clima_tempo.dart';

import 'model/cidade.dart';

Future<void> _validarDiretorio() async {
  final dir = Directory('log');
  if (!(await dir.exists())) {
    await dir.create();
  }
}

Future<void> salvarTempoIsolate(ClimaTempo climaTempo) async {
  final receivePortError = ReceivePort();
  receivePortError.listen((error) {
    final errorList = error as List<dynamic>;
    salvarErro(
      errorList.first,
      StackTrace.fromString(errorList[1]),
      fileName: 'io.txt',
    );
  });

  final isolate = await Isolate.spawn(
    salvarTempo,
    climaTempo,
    onError: receivePortError.sendPort,
  );
  _registrarCallbackFinalizacao(isolate);
}

Future<void> salvarTempo(ClimaTempo climaTempo) async {
  await _validarDiretorio();
  final file = File('log/${climaTempo.cidade.id}.txt');
  await file.writeAsString('===\n$climaTempo', mode: FileMode.append);
}

void _registrarCallbackFinalizacao(Isolate isolate) {
  final receivePort = ReceivePort();
  receivePort.listen((mensagem) {
    print(mensagem);
    receivePort.close();
  });
  isolate.addOnExitListener(receivePort.sendPort,
      response: 'Arquivo salvo com sucesso!');
}

Future<void> salvarCidadesIsolate(List<Cidade> cidades) async {
  final receivePortError = ReceivePort();
  receivePortError.listen((error) {
    final errorList = error as List<dynamic>;
    salvarErro(
      errorList.first,
      StackTrace.fromString(errorList[1]),
      fileName: 'io.txt',
    );
  });

  final isolate = await Isolate.spawn(
    salvarCidades,
    cidades,
    onError: receivePortError.sendPort,
  );
  _registrarCallbackFinalizacao(isolate);
}

Future<void> salvarCidades(List<Cidade> cidades) async {
  await _validarDiretorio();
  final file = File('log/cidades.txt');
  final sink = file.openWrite(mode: FileMode.write);
  cidades.forEach((c) => sink.writeln(c));
  await sink.flush();
  await sink.close();
}

Future<void> salvarErro(Object erro, StackTrace stackTrace,
    {String? fileName}) async {
  await _validarDiretorio();

  final data = DateTime.now();
  final ano = data.year;
  final mes = _doisDigitos(data.month);
  final dia = _doisDigitos(data.day);
  final fileDir = 'log/${fileName ?? '$dia$mes$ano.txt'}';
  final file = File(fileDir);

  await file.writeAsString('${data.toIso8601String()} : $erro\n',
      mode: FileMode.append);
  await file.writeAsString('${data.toIso8601String()} : $stackTrace',
      mode: FileMode.append);
}

String _doisDigitos(int numero) {
  if (numero >= 10) return '$numero';
  return '0$numero';
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/cidade.dart
================================================
class Cidade {
  Cidade.fromJson(Map<String, dynamic> jsonMap)
      : id = jsonMap['id'],
        nome = jsonMap['name'],
        estado = jsonMap['state'],
        pais = jsonMap['country'];
  final int id;
  final String nome;
  final String estado;
  final String pais;

  @override
  String toString() =>
      'Id:  $id  -  Nome:  $nome  -  Estado:  $estado, País:  $pais';
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/clima_tempo.dart
================================================
import 'cidade.dart';
import 'tempo.dart';

class ClimaTempo {
  ClimaTempo.fromJson(Map<String, dynamic> jsonMap)
      : cidade = Cidade.fromJson(jsonMap),
        tempo = Tempo.fromJson(jsonMap['data']);
  final Cidade cidade;
  final Tempo tempo;

  String toString() => '''
Cidade:  ${cidade.nome},  ${cidade.estado}  -  ${cidade.pais}
${tempo.data}
Temperatura:  ${tempo.temperatura}  -  Sensação:  ${tempo.sensacao}
Umidade:  ${tempo.humidade}  -  Velocidade  do  Vento:  ${tempo.velocidadeVento}
''';
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/tempo.dart
================================================
class Tempo {
  Tempo.fromJson(Map<String, dynamic> jsonMap)
      : temperatura = jsonMap['temperature'],
        velocidadeVento = jsonMap['wind_velocity'],
        humidade = jsonMap['humidity'],
        sensacao = jsonMap['sensation'],
        data = DateTime.parse(jsonMap['date']);
  final num temperatura;
  final num velocidadeVento;
  final num humidade;
  final num sensacao;
  final DateTime data;
}


================================================
FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/13032022.txt
================================================
2022-03-13T22:18:37.172126 : {"error":true,"detail":"Invalid token"}
2022-03-13T22:18:37.172126 : #0      climaAtual (package:climatempo/api.dart:34:35)
<asynchronous suspension>
#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)
<asynchronous suspension>
#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)
<asynchronous suspension>
2022-03-13T22:18:54.065327 : {"error":true,"detail":"Invalid token"}
2022-03-13T22:18:54.065327 : #0      climaAtual (package:climatempo/api.dart:34:35)
<asynchronous suspension>
#1      registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10)
<asynchronous suspension>
#2      executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19)
<asynchronous suspension>2022-03-13T22:53:09.878905 : type 'List<dynamic>' is not a subtype of type 'StackTrace'
2022-03-13T22:53:09.878905 : #0      salvarTempoIsolate.<anonymous closure> (package:climatempo/log.dart:19:32)
#1      _rootRunUnary (dart:async/zone.dart:1442:13)
#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
#3      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
#4      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
#5      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#6      _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#7      _StreamController._add (dart:async/stream_controller.dart:648:7)
#8      _StreamController.add (dart:async/stream_controller.dart:596:5)
#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
2022-03-13T22:54:20.667082 : type 'List<dynamic>' is not a subtype of type 'StackTrace'
2022-03-13T22:54:20.667082 : #0      salvarTempoIsolate.<anonymous closure> (package:climatempo/log.dart:21:32)
#1      _rootRunUnary (dart:async/zone.dart:1442:13)
#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
#3      _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
#4      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
#5      _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
#6      _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19)
#7      _StreamController._add (dart:async/stream_controller.dart:648:7)
#8      _StreamController.add (dart:async/stream_controller.dart:596:5)
#9      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
2022-03-13T22:55:14.830927 : type 'String' is not a subtype of type 'StackTrace'
2022-03-13T22:55:14.830927 : #0      salvarTempoIsolate.<anonymous closure> (package:climatempo/log.dart:20:42)
#1      _rootRunUnary (dart:async/zone.dart:1442:13)
#2      _CustomZone.runUnary (dart:async/zone.dart:1335:19)
#3      _CustomZone.runUnaryGuar
Download .txt
gitextract__k1_49lz/

├── .github/
│   └── workflows/
│       └── deploy.yaml
├── .gitignore
├── CNAME
├── README.md
├── code/
│   └── pt_Br/
│       ├── 01_capitulo/
│       │   ├── 01_primeiro_programa/
│       │   │   └── main.dart
│       │   └── 02_erro_main/
│       │       └── main.dart
│       ├── 02_capitulo/
│       │   ├── 01_operadores_aritmeticos/
│       │   │   └── main.dart
│       │   ├── 02_operadores_relacionais_equalidade/
│       │   │   └── main.dart
│       │   ├── 03_operadores_logicos/
│       │   │   └── main.dart
│       │   ├── 04_operador_bit_and/
│       │   │   └── main.dart
│       │   ├── 05_operador_bit_or/
│       │   │   └── main.dart
│       │   ├── 06_operador_bit_xor/
│       │   │   └── main.dart
│       │   ├── 07_operador_bit_not/
│       │   │   └── main.dart
│       │   ├── 08_operador_bit_shift_direita/
│       │   │   └── main.dart
│       │   ├── 09_operador_bit_shift_esquerda/
│       │   │   └── main.dart
│       │   ├── 10_operador_bit_shift_direita_unsigned/
│       │   │   └── main.dart
│       │   ├── 11_operador_atribuicao/
│       │   │   └── main.dart
│       │   ├── 12_operador_incremento_decremento_1/
│       │   │   └── main.dart
│       │   ├── 13_operador_incremento_decremento_2/
│       │   │   └── main.dart
│       │   ├── 14_operador_validacao_tipo_1/
│       │   │   └── main.dart
│       │   ├── 15_operador_validacao_tipo_2/
│       │   │   └── main.dart
│       │   ├── 16_operador_cascade/
│       │   │   └── main.dart
│       │   ├── 17_operador_spread/
│       │   │   └── main.dart
│       │   ├── 18_operador_ternario/
│       │   │   └── main.dart
│       │   ├── 19_operador_acesso/
│       │   │   └── main.dart
│       │   ├── 20_operador_ternario_nulo/
│       │   │   └── main.dart
│       │   ├── 21_operador_atribuicao_nulo/
│       │   │   └── main.dart
│       │   ├── 22_operador_acesso_nulo/
│       │   │   └── main.dart
│       │   ├── 23_operador_cascade_nulo/
│       │   │   └── main.dart
│       │   ├── 24_operador_acesso_itens_nulo/
│       │   │   └── main.dart
│       │   ├── 25_operador_bang/
│       │   │   └── main.dart
│       │   ├── 26_precedencia_operadores/
│       │   │   └── main.dart
│       │   ├── 27_if_else/
│       │   │   └── main.dart
│       │   ├── 28_switch_case/
│       │   │   └── main.dart
│       │   ├── 29_switch_case_patterns/
│       │   │   └── main.dart
│       │   ├── 30_switch_case_expressions/
│       │   │   └── main.dart
│       │   ├── 31_if_case/
│       │   │   └── main.dart
│       │   ├── 32_if_case_when/
│       │   │   └── main.dart
│       │   ├── 33_while/
│       │   │   └── main.dart
│       │   ├── 34_do_while/
│       │   │   └── main.dart
│       │   ├── 35_for/
│       │   │   └── main.dart
│       │   ├── 36_for_nomeado/
│       │   │   └── main.dart
│       │   ├── 37_for_in/
│       │   │   └── main.dart
│       │   └── 38_assert/
│       │       └── main.dart
│       ├── 03_capitulo/
│       │   ├── 01_coercao/
│       │   │   └── main.dart
│       │   ├── 02_dart_analyzer_1/
│       │   │   └── main.dart
│       │   ├── 03_dart_analyzer_2/
│       │   │   └── main.dart
│       │   ├── 04_inferencia_tipo/
│       │   │   └── main.dart
│       │   ├── 05_inferencia_tipo_parametros/
│       │   │   └── main.dart
│       │   ├── 06_dynamic/
│       │   │   └── main.dart
│       │   ├── 07_numeros/
│       │   │   └── main.dart
│       │   ├── 08_booleanos/
│       │   │   └── main.dart
│       │   ├── 09_symbols/
│       │   │   └── main.dart
│       │   ├── 10_null_safety/
│       │   │   └── main.dart
│       │   ├── 11_nullable_types/
│       │   │   └── main.dart
│       │   ├── 12_type_promotion/
│       │   │   └── main.dart
│       │   ├── 13_type_promotion_nullable/
│       │   │   └── main.dart
│       │   ├── 14_operador_bang/
│       │   │   └── main.dart
│       │   ├── 15_strings/
│       │   │   └── main.dart
│       │   ├── 16_surrogate_pairs/
│       │   │   └── main.dart
│       │   ├── 17_criacao_strings/
│       │   │   └── main.dart
│       │   ├── 18_interpolacao_strings/
│       │   │   └── main.dart
│       │   ├── 19_otimizacao_strings/
│       │   │   └── main.dart
│       │   ├── 20_strings_sob_demanda/
│       │   │   └── main.dart
│       │   ├── 21_strings_geral/
│       │   │   └── main.dart
│       │   ├── 22_variaveis_var/
│       │   │   └── main.dart
│       │   ├── 23_variaveis_static/
│       │   │   └── main.dart
│       │   ├── 24_variaveis_final_const/
│       │   │   └── main.dart
│       │   └── 25_variaveis_late/
│       │       └── main.dart
│       ├── 04_capitulo/
│       │   ├── 01_fatorial/
│       │   │   └── main.dart
│       │   ├── 02_escopo/
│       │   │   └── main.dart
│       │   ├── 03_tipo_function/
│       │   │   └── main.dart
│       │   ├── 04_retornos/
│       │   │   └── main.dart
│       │   ├── 05_never/
│       │   │   └── main.dart
│       │   ├── 06_escopo_closure/
│       │   │   └── main.dart
│       │   ├── 07_tear_off/
│       │   │   └── main.dart
│       │   ├── 08_parametro_posicional_obrigatorio/
│       │   │   └── main.dart
│       │   ├── 09_parametro_posicional_opcional/
│       │   │   └── main.dart
│       │   ├── 10_parametro_nomeado_opcional/
│       │   │   └── main.dart
│       │   ├── 11_parametro_nomeado_obrigatorio/
│       │   │   └── main.dart
│       │   ├── 12_enums/
│       │   │   └── main.dart
│       │   └── 13_typedef/
│       │       └── main.dart
│       ├── 05_capitulo/
│       │   ├── 01_errors/
│       │   │   └── main.dart
│       │   ├── 02_exceptions/
│       │   │   └── main.dart
│       │   ├── 03_throw/
│       │   │   └── main.dart
│       │   ├── 04_exception_customizada/
│       │   │   └── main.dart
│       │   ├── 05_assert/
│       │   │   └── main.dart
│       │   ├── 06_assert_x_error/
│       │   │   └── main.dart
│       │   ├── 07_try_catch/
│       │   │   └── main.dart
│       │   ├── 08_try_catch_on/
│       │   │   └── main.dart
│       │   ├── 09_try_catch_exception/
│       │   │   └── main.dart
│       │   └── 10_try_catch_finally/
│       │       └── main.dart
│       ├── 06_capitulo/
│       │   └── 01_codigo_ansi/
│       │       └── main.dart
│       ├── 07_capitulo/
│       │   ├── 01_analyzer/
│       │   │   └── main.dart
│       │   ├── 02_analyzer_linter/
│       │   │   ├── analysis_options.yaml
│       │   │   └── main.dart
│       │   └── 03_comments/
│       │       └── main.dart
│       ├── 08_capitulo/
│       │   ├── 01_objeto/
│       │   │   └── main.dart
│       │   ├── 02_to_string/
│       │   │   └── main.dart
│       │   ├── 03_equalidade/
│       │   │   └── main.dart
│       │   ├── 04_sobrescrita_operadores/
│       │   │   └── main.dart
│       │   ├── 05_construtor_padrao/
│       │   │   └── main.dart
│       │   ├── 06_construtor_nomeado/
│       │   │   └── main.dart
│       │   ├── 07_construtor_const/
│       │   │   └── main.dart
│       │   ├── 08_construtor_factory/
│       │   │   └── main.dart
│       │   ├── 09_encapsulamento/
│       │   │   └── main.dart
│       │   ├── 10_heranca/
│       │   │   └── main.dart
│       │   ├── 11_polimorfismo/
│       │   │   └── main.dart
│       │   ├── 12_classes_abstratas/
│       │   │   └── main.dart
│       │   ├── 13_interfaces/
│       │   │   └── main.dart
│       │   ├── 14_mixins/
│       │   │   └── main.dart
│       │   ├── 15_mixins_a_fundo/
│       │   │   └── main.dart
│       │   ├── 16_extension_methods/
│       │   │   └── main.dart
│       │   ├── 17_extension_methods_arquivo_diferente/
│       │   │   ├── main.dart
│       │   │   └── strings_extension.dart
│       │   ├── 18_classe_wrapper/
│       │   │   └── main.dart
│       │   ├── 19_extension_types/
│       │   │   ├── main.dart
│       │   │   └── pubspec.yaml
│       │   ├── 20_modifiers_abstract/
│       │   │   └── main.dart
│       │   ├── 21_modifiers_interface/
│       │   │   ├── arquivo.dart
│       │   │   └── main.dart
│       │   ├── 22_modifiers_base/
│       │   │   ├── arquivo.dart
│       │   │   └── main.dart
│       │   ├── 23_modifiers_final/
│       │   │   ├── arquivo.dart
│       │   │   └── main.dart
│       │   └── 24_modifiers_sealed/
│       │       └── main.dart
│       ├── 09_capitulo/
│       │   ├── 01_generics_1/
│       │   │   └── main.dart
│       │   ├── 02_generics_2/
│       │   │   └── main.dart
│       │   ├── 03_generics_3/
│       │   │   └── main.dart
│       │   ├── 04_generics_restringindo_tipo/
│       │   │   └── main.dart
│       │   ├── 05_generics_metodos/
│       │   │   └── main.dart
│       │   ├── 06_lists/
│       │   │   └── main.dart
│       │   ├── 07_iterando_lists/
│       │   │   └── main.dart
│       │   ├── 08_linked_hash_set/
│       │   │   └── main.dart
│       │   ├── 09_hash_set/
│       │   │   └── main.dart
│       │   ├── 10_splay_tree_set/
│       │   │   └── main.dart
│       │   ├── 11_queue/
│       │   │   └── main.dart
│       │   ├── 12_map/
│       │   │   └── main.dart
│       │   ├── 13_records/
│       │   │   └── main.dart
│       │   ├── 14_records_tipados/
│       │   │   └── main.dart
│       │   ├── 15_records_equalidade/
│       │   │   └── main.dart
│       │   ├── 16_records_retorno_funcao/
│       │   │   └── main.dart
│       │   ├── 17_pattern_matching/
│       │   │   └── main.dart
│       │   ├── 18_pattern_destructuring/
│       │   │   └── main.dart
│       │   ├── 19_pattern_for_looping/
│       │   │   └── main.dart
│       │   └── 20_pattern_collection_literal/
│       │       └── main.dart
│       ├── 10_capitulo/
│       │   ├── 01_event_loop/
│       │   │   └── main.dart
│       │   ├── 02_programa_sincrono_1/
│       │   │   └── main.dart
│       │   ├── 03_programa_sincrono_2/
│       │   │   └── main.dart
│       │   ├── 04_future/
│       │   │   └── main.dart
│       │   ├── 05_future_encadeado/
│       │   │   └── main.dart
│       │   ├── 06_erro_cadeia_assincrona/
│       │   │   └── main.dart
│       │   ├── 07_erro_cadeia_try_catch/
│       │   │   └── main.dart
│       │   ├── 08_erro_cadeia_catch_error/
│       │   │   └── main.dart
│       │   ├── 09_erro_cadeia_on_error/
│       │   │   └── main.dart
│       │   ├── 10_future_sync/
│       │   │   └── main.dart
│       │   ├── 11_future_microtask/
│       │   │   └── main.dart
│       │   ├── 12_future_value/
│       │   │   └── main.dart
│       │   ├── 13_future_error/
│       │   │   └── main.dart
│       │   ├── 14_future_wait/
│       │   │   └── main.dart
│       │   ├── 15_future_any/
│       │   │   └── main.dart
│       │   ├── 16_async_await/
│       │   │   └── main.dart
│       │   ├── 17_async_await_fluxo/
│       │   │   └── main.dart
│       │   ├── 18_async_await_x_future/
│       │   │   └── main.dart
│       │   ├── 19_async_await_erro/
│       │   │   └── main.dart
│       │   ├── 20_completer_future/
│       │   │   └── main.dart
│       │   └── 21_completer_flexibilidade/
│       │       └── main.dart
│       ├── 11_capitulo/
│       │   ├── 01_dart_args/
│       │   │   └── main.dart
│       │   ├── 02_dart_http/
│       │   │   ├── main.dart
│       │   │   └── pubspec.yaml
│       │   └── 03_dart_convert/
│       │       └── main.dart
│       ├── 12_capitulo/
│       │   ├── 01_stream_subscription/
│       │   │   └── main.dart
│       │   ├── 02_stream_subscription_varios_dados/
│       │   │   └── main.dart
│       │   ├── 03_stream_subscription_callbacks/
│       │   │   └── main.dart
│       │   ├── 04_inscricao_unica_listener/
│       │   │   └── main.dart
│       │   ├── 05_broadcast_listener/
│       │   │   └── main.dart
│       │   ├── 06_stream_controller/
│       │   │   └── main.dart
│       │   ├── 07_stream_controller_sink/
│       │   │   └── main.dart
│       │   ├── 08_stream_consumer/
│       │   │   └── main.dart
│       │   ├── 09_stream_consumer_2/
│       │   │   └── main.dart
│       │   ├── 10_stream_sink_close/
│       │   │   └── main.dart
│       │   ├── 11_stream_sink_x_stream_controller/
│       │   │   └── main.dart
│       │   ├── 12_controller_callback_inscricao_unica/
│       │   │   └── main.dart
│       │   ├── 13_controller_callback_broadcast/
│       │   │   └── main.dart
│       │   ├── 14_stream_await/
│       │   │   └── main.dart
│       │   ├── 15_stream_await_error/
│       │   │   └── main.dart
│       │   ├── 16_stream_await_sem_encerramento/
│       │   │   └── main.dart
│       │   ├── 17_stream_propriedades/
│       │   │   └── main.dart
│       │   ├── 18_stream_metodos_busca/
│       │   │   └── main.dart
│       │   ├── 19_stream_metodos_validacao/
│       │   │   └── main.dart
│       │   ├── 20_as_broadcast_stream/
│       │   │   └── main.dart
│       │   ├── 21_distinct/
│       │   │   └── main.dart
│       │   ├── 22_map/
│       │   │   └── main.dart
│       │   ├── 23_expand/
│       │   │   └── main.dart
│       │   ├── 24_async_map/
│       │   │   └── main.dart
│       │   ├── 25_async_expand/
│       │   │   └── main.dart
│       │   ├── 26_skip/
│       │   │   └── main.dart
│       │   ├── 27_skip_while/
│       │   │   └── main.dart
│       │   ├── 28_take/
│       │   │   └── main.dart
│       │   ├── 29_take_while/
│       │   │   └── main.dart
│       │   ├── 30_where/
│       │   │   └── main.dart
│       │   ├── 31_timeout/
│       │   │   └── main.dart
│       │   ├── 32_to_list_to_set/
│       │   │   └── main.dart
│       │   ├── 33_drain/
│       │   │   └── main.dart
│       │   ├── 34_for_each/
│       │   │   └── main.dart
│       │   ├── 35_fold/
│       │   │   └── main.dart
│       │   ├── 36_reduce/
│       │   │   └── main.dart
│       │   ├── 37_join/
│       │   │   └── main.dart
│       │   ├── 38_cast/
│       │   │   └── main.dart
│       │   ├── 39_handle_error/
│       │   │   └── main.dart
│       │   └── 40_pipe/
│       │       └── main.dart
│       ├── 13_capitulo/
│       │   ├── 01_interface_stream_transformer/
│       │   │   └── main.dart
│       │   ├── 02_construtor_stream_transformer/
│       │   │   └── main.dart
│       │   ├── 03_stream_transformer_base/
│       │   │   └── main.dart
│       │   ├── 04_stream_transformer_from_handlers/
│       │   │   └── main.dart
│       │   ├── 05_stream_transformer_from_bind/
│       │   │   └── main.dart
│       │   ├── 06_problema_inscricao_unica/
│       │   │   └── main.dart
│       │   ├── 07_sem_perda_eventos/
│       │   │   └── main.dart
│       │   ├── 08_perda_eventos_broadcast/
│       │   │   └── main.dart
│       │   ├── 09_broadcast_subscription_buffer/
│       │   │   └── main.dart
│       │   ├── 10_geradores_sincronos_yield/
│       │   │   └── main.dart
│       │   ├── 11_geradores_sincronos_yield_*/
│       │   │   └── main.dart
│       │   ├── 12_geradores_assincronos_yield/
│       │   │   └── main.dart
│       │   ├── 13_geradores_assincronos_yield_*/
│       │   │   └── main.dart
│       │   └── 14_server/
│       │       └── main.dart
│       ├── 14_capitulo/
│       │   ├── 01_isolate/
│       │   │   └── main.dart
│       │   ├── 02_nova_isolate/
│       │   │   └── main.dart
│       │   ├── 03_unidirecional_unica/
│       │   │   └── main.dart
│       │   ├── 04_unidirecional_frequente/
│       │   │   └── main.dart
│       │   ├── 05_bidirecional/
│       │   │   └── main.dart
│       │   ├── 06_controle_isolate/
│       │   │   └── main.dart
│       │   ├── 07_isolate_listeners/
│       │   │   └── main.dart
│       │   ├── 08_spawn_uri/
│       │   │   ├── isolate.dart
│       │   │   └── main.dart
│       │   ├── 09_isolate_run/
│       │   │   └── main.dart
│       │   ├── 10_zone_root/
│       │   │   └── main.dart
│       │   ├── 11_nova_zone/
│       │   │   └── main.dart
│       │   ├── 12_run_zoned/
│       │   │   └── main.dart
│       │   ├── 13_hierarquia_zones/
│       │   │   └── main.dart
│       │   ├── 14_zone_livre_erros/
│       │   │   └── main.dart
│       │   ├── 15_propagacao_erros_zones/
│       │   │   └── main.dart
│       │   ├── 16_propagacao_erros_zones_2/
│       │   │   └── main.dart
│       │   ├── 17_propagacao_erros_zones_3/
│       │   │   └── main.dart
│       │   ├── 18_valores_locais_zones/
│       │   │   └── main.dart
│       │   └── 19_zone_specification/
│       │       └── main.dart
│       ├── 15_capitulo/
│       │   ├── 01_criacao_diretorio/
│       │   │   └── main.dart
│       │   ├── 02_remocao_diretorio/
│       │   │   └── main.dart
│       │   ├── 03_criacao_arquivo/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   ├── 04_escrita_arquivo/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   ├── 05_escrita_arquivo_sob_demanda/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   ├── 06_ler_arquivo/
│       │   │   ├── main.dart
│       │   │   └── teste.txt
│       │   └── 07_ler_arquivo_sob_demanda/
│       │       ├── main.dart
│       │       └── teste.txt
│       ├── e_com_voce/
│       │   ├── 02_imc/
│       │   │   └── main.dart
│       │   ├── 03_benchmark_strings/
│       │   │   └── main.dart
│       │   ├── 03_circunferencia/
│       │   │   └── main.dart
│       │   ├── 03_regex_cpf/
│       │   │   └── main.dart
│       │   ├── 04_funcoes_fatorial_recursao/
│       │   │   └── main.dart
│       │   ├── 04_funcoes_fatorial_recursao_closure/
│       │   │   └── main.dart
│       │   ├── 05_try_catch_rethrow/
│       │   │   └── main.dart
│       │   ├── 08_construtor_inicializadores/
│       │   │   └── main.dart
│       │   ├── 08_redirecionando_construtores/
│       │   │   └── main.dart
│       │   ├── 08_singleton/
│       │   │   └── main.dart
│       │   ├── 09_bidirectional_iterator/
│       │   │   └── main.dart
│       │   ├── 09_programador_comparable/
│       │   │   └── main.dart
│       │   ├── 09_teoria_conjuntos_set/
│       │   │   └── main.dart
│       │   ├── 10_microtask_infinita/
│       │   │   └── main.dart
│       │   ├── 13_gerador_divisores/
│       │   │   └── main.dart
│       │   ├── 13_gerador_valores_impar/
│       │   │   └── main.dart
│       │   ├── 13_stream_transformer_email/
│       │   │   └── main.dart
│       │   ├── 13_stream_transformer_telefone/
│       │   │   └── main.dart
│       │   ├── 14_isolate_bidirecional_stream_channel/
│       │   │   ├── main.dart
│       │   │   └── pubspec.yaml
│       │   ├── 15_climatempo_isolate_diretorios/
│       │   │   ├── .gitignore
│       │   │   ├── CHANGELOG.md
│       │   │   ├── README.md
│       │   │   ├── analysis_options.yaml
│       │   │   ├── bin/
│       │   │   │   └── climatempo.dart
│       │   │   ├── lib/
│       │   │   │   ├── alerta_server.dart
│       │   │   │   ├── api.dart
│       │   │   │   ├── log.dart
│       │   │   │   └── model/
│       │   │   │       ├── cidade.dart
│       │   │   │       ├── clima_tempo.dart
│       │   │   │       └── tempo.dart
│       │   │   ├── log/
│       │   │   │   ├── cidades.txt
│       │   │   │   ├── clima/
│       │   │   │   │   └── 4915.txt
│       │   │   │   └── erro/
│       │   │   │       └── io/
│       │   │   │           └── io.txt
│       │   │   └── pubspec.yaml
│       │   ├── 15_climatempo_isolate_erros/
│       │   │   ├── .gitignore
│       │   │   ├── CHANGELOG.md
│       │   │   ├── README.md
│       │   │   ├── analysis_options.yaml
│       │   │   ├── bin/
│       │   │   │   └── climatempo.dart
│       │   │   ├── lib/
│       │   │   │   ├── alerta_server.dart
│       │   │   │   ├── api.dart
│       │   │   │   ├── log.dart
│       │   │   │   └── model/
│       │   │   │       ├── cidade.dart
│       │   │   │       ├── clima_tempo.dart
│       │   │   │       └── tempo.dart
│       │   │   ├── log/
│       │   │   │   ├── 13032022.txt
│       │   │   │   ├── 4915.txt
│       │   │   │   ├── cidades.txt
│       │   │   │   └── io.txt
│       │   │   └── pubspec.yaml
│       │   └── 15_climatempo_isolate_zone/
│       │       ├── .gitignore
│       │       ├── CHANGELOG.md
│       │       ├── README.md
│       │       ├── analysis_options.yaml
│       │       ├── bin/
│       │       │   └── climatempo.dart
│       │       ├── lib/
│       │       │   ├── alerta_server.dart
│       │       │   ├── api.dart
│       │       │   ├── log.dart
│       │       │   └── model/
│       │       │       ├── cidade.dart
│       │       │       ├── clima_tempo.dart
│       │       │       └── tempo.dart
│       │       ├── log/
│       │       │   ├── 13032022.txt
│       │       │   ├── 4915.txt
│       │       │   ├── cidades.txt
│       │       │   └── io.txt
│       │       └── pubspec.yaml
│       └── na_pratica/
│           ├── 03_strings_palindromo/
│           │   └── main.dart
│           ├── 04_pedra_papel_tesoura_lagarto_spock/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── lib/
│           │   │   └── src/
│           │   │       ├── partida.dart
│           │   │       └── resultado.dart
│           │   ├── pubspec.yaml
│           │   └── web/
│           │       ├── index.html
│           │       ├── main.dart
│           │       └── styles.css
│           ├── 06_logger_library/
│           │   └── lib/
│           │       ├── log/
│           │       │   ├── log.dart
│           │       │   └── printer.dart
│           │       └── main.dart
│           ├── 07_logger_package/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── doc/
│           │   │   └── api/
│           │   │       ├── __404error.html
│           │   │       ├── categories.json
│           │   │       ├── index.html
│           │   │       ├── index.json
│           │   │       ├── logger/
│           │   │       │   ├── Cores/
│           │   │       │   │   ├── Cores.html
│           │   │       │   │   ├── ansi.html
│           │   │       │   │   ├── toString.html
│           │   │       │   │   └── values-constant.html
│           │   │       │   ├── Cores-enum-sidebar.html
│           │   │       │   ├── Cores.html
│           │   │       │   ├── Logger/
│           │   │       │   │   ├── Logger.html
│           │   │       │   │   ├── error.html
│           │   │       │   │   ├── info.html
│           │   │       │   │   ├── nivel.html
│           │   │       │   │   ├── printer.html
│           │   │       │   │   └── warning.html
│           │   │       │   ├── Logger-class-sidebar.html
│           │   │       │   ├── Logger-class.html
│           │   │       │   ├── Nivel/
│           │   │       │   │   ├── Nivel.html
│           │   │       │   │   ├── toString.html
│           │   │       │   │   └── values-constant.html
│           │   │       │   ├── Nivel-enum-sidebar.html
│           │   │       │   ├── Nivel.html
│           │   │       │   ├── Printer/
│           │   │       │   │   ├── Printer.html
│           │   │       │   │   ├── fim.html
│           │   │       │   │   ├── inicio.html
│           │   │       │   │   └── log.html
│           │   │       │   ├── Printer-class-sidebar.html
│           │   │       │   ├── Printer-class.html
│           │   │       │   ├── ansiCores-constant.html
│           │   │       │   ├── logger-library-sidebar.html
│           │   │       │   ├── logger-library.html
│           │   │       │   └── resetarCor-constant.html
│           │   │       ├── search.html
│           │   │       └── static-assets/
│           │   │           ├── docs.dart.js
│           │   │           ├── github.css
│           │   │           ├── highlight.pack.js
│           │   │           ├── readme.md
│           │   │           ├── script.js
│           │   │           └── styles.css
│           │   ├── example/
│           │   │   └── main.dart
│           │   ├── lib/
│           │   │   ├── logger.dart
│           │   │   └── src/
│           │   │       ├── log.dart
│           │   │       ├── printer.dart
│           │   │       ├── printer_console.dart
│           │   │       └── printer_io.dart
│           │   └── pubspec.yaml
│           ├── 11_climatempo/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   ├── climatempo.aot
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── api.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   └── pubspec.yaml
│           ├── 13_climatempo_client/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo_client.dart
│           │   └── pubspec.yaml
│           ├── 13_climatempo_server/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── alerta_server.dart
│           │   │   ├── api.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   └── pubspec.yaml
│           ├── 15_climatempo_arquivos/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── alerta_server.dart
│           │   │   ├── api.dart
│           │   │   ├── log.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   ├── log/
│           │   │   ├── 4915.txt
│           │   │   └── cidades.txt
│           │   └── pubspec.yaml
│           ├── 15_climatempo_arquivos_isolate/
│           │   ├── .gitignore
│           │   ├── CHANGELOG.md
│           │   ├── README.md
│           │   ├── analysis_options.yaml
│           │   ├── bin/
│           │   │   └── climatempo.dart
│           │   ├── lib/
│           │   │   ├── alerta_server.dart
│           │   │   ├── api.dart
│           │   │   ├── log.dart
│           │   │   └── model/
│           │   │       ├── cidade.dart
│           │   │       ├── clima_tempo.dart
│           │   │       └── tempo.dart
│           │   ├── log/
│           │   │   ├── 4915.txt
│           │   │   └── cidades.txt
│           │   └── pubspec.yaml
│           └── 15_climatempo_arquivos_isolate_zone/
│               ├── .gitignore
│               ├── CHANGELOG.md
│               ├── README.md
│               ├── analysis_options.yaml
│               ├── bin/
│               │   └── climatempo.dart
│               ├── lib/
│               │   ├── alerta_server.dart
│               │   ├── api.dart
│               │   ├── log.dart
│               │   └── model/
│               │       ├── cidade.dart
│               │       ├── clima_tempo.dart
│               │       └── tempo.dart
│               ├── log/
│               │   ├── 13032022.txt
│               │   ├── 4915.txt
│               │   └── cidades.txt
│               └── pubspec.yaml
└── website/
    ├── .gitignore
    ├── README.md
    ├── gatsby-config.js
    ├── package.json
    └── src/
        ├── components/
        │   ├── audience/
        │   │   └── audience.js
        │   ├── author/
        │   │   ├── author.js
        │   │   └── styles.js
        │   ├── book-info/
        │   │   ├── book-info.js
        │   │   └── styles.js
        │   ├── github/
        │   │   ├── github.js
        │   │   └── styles.js
        │   ├── layout/
        │   │   ├── error.js
        │   │   ├── footer/
        │   │   │   ├── footer.js
        │   │   │   └── styles.js
        │   │   ├── global.js
        │   │   ├── header/
        │   │   │   ├── header.js
        │   │   │   └── styles.js
        │   │   ├── layout.js
        │   │   ├── normalize.css
        │   │   ├── styles.js
        │   │   └── theme.js
        │   └── table-of-contents/
        │       ├── styles.js
        │       ├── table-of-contents-full.js
        │       └── table-of-contents.js
        └── pages/
            ├── 404.js
            ├── index.js
            └── table-of-contents.js
Download .txt
SYMBOL INDEX (1610 symbols across 334 files)

FILE: code/pt_Br/01_capitulo/01_primeiro_programa/main.dart
  function main (line 2) | main()

FILE: code/pt_Br/01_capitulo/02_erro_main/main.dart
  function semMain (line 4) | semMain()

FILE: code/pt_Br/02_capitulo/01_operadores_aritmeticos/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/02_operadores_relacionais_equalidade/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/03_operadores_logicos/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/04_operador_bit_and/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/05_operador_bit_or/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/06_operador_bit_xor/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/07_operador_bit_not/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/08_operador_bit_shift_direita/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/09_operador_bit_shift_esquerda/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/10_operador_bit_shift_direita_unsigned/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/11_operador_atribuicao/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/12_operador_incremento_decremento_1/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/13_operador_incremento_decremento_2/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/14_operador_validacao_tipo_1/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/15_operador_validacao_tipo_2/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/16_operador_cascade/main.dart
  function main (line 7) | void main()

FILE: code/pt_Br/02_capitulo/17_operador_spread/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/18_operador_ternario/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/19_operador_acesso/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/20_operador_ternario_nulo/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/21_operador_atribuicao_nulo/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/22_operador_acesso_nulo/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/23_operador_cascade_nulo/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/24_operador_acesso_itens_nulo/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/25_operador_bang/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/26_precedencia_operadores/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/27_if_else/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/28_switch_case/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/29_switch_case_patterns/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/30_switch_case_expressions/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/31_if_case/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/32_if_case_when/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/33_while/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/34_do_while/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/35_for/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/36_for_nomeado/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/37_for_in/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/02_capitulo/38_assert/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/01_coercao/main.dart
  function main (line 5) | void main()

FILE: code/pt_Br/03_capitulo/02_dart_analyzer_1/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/03_capitulo/03_dart_analyzer_2/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/03_capitulo/04_inferencia_tipo/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/05_inferencia_tipo_parametros/main.dart
  function main (line 1) | void main()
  function soma (line 8) | soma(a, b)

FILE: code/pt_Br/03_capitulo/06_dynamic/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/07_numeros/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/08_booleanos/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/09_symbols/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/10_null_safety/main.dart
  function main (line 2) | void main()

FILE: code/pt_Br/03_capitulo/11_nullable_types/main.dart
  function main (line 1) | void main()
  function printNome (line 6) | void printNome(String nome, String? sobrenome)
  function valorImpar (line 10) | void valorImpar(int numero)

FILE: code/pt_Br/03_capitulo/12_type_promotion/main.dart
  function main (line 1) | void main()
  function textoGrande (line 8) | bool textoGrande(Object objeto)

FILE: code/pt_Br/03_capitulo/13_type_promotion_nullable/main.dart
  function main (line 1) | void main()
  function letrasNome (line 9) | List<String> letrasNome(String nome, String? sobrenome)
  function letrasNome2 (line 17) | List<String> letrasNome2(String nome, String? sobrenome)

FILE: code/pt_Br/03_capitulo/14_operador_bang/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/03_capitulo/15_strings/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/16_surrogate_pairs/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/17_criacao_strings/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/18_interpolacao_strings/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/03_capitulo/19_otimizacao_strings/main.dart
  function main (line 5) | void main()

FILE: code/pt_Br/03_capitulo/20_strings_sob_demanda/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/03_capitulo/21_strings_geral/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/03_capitulo/22_variaveis_var/main.dart
  function main (line 6) | void main()

FILE: code/pt_Br/03_capitulo/23_variaveis_static/main.dart
  class Livro (line 2) | class Livro {
  function main (line 12) | void main()

FILE: code/pt_Br/03_capitulo/24_variaveis_final_const/main.dart
  function main (line 17) | void main()
  function getValorCanonicalizado (line 30) | List getValorCanonicalizado()

FILE: code/pt_Br/03_capitulo/25_variaveis_late/main.dart
  class Pizza (line 1) | class Pizza {
    method media (line 5) | void media()
    method grande (line 9) | void grande()
    method servir (line 13) | String servir()
  function main (line 16) | void main()

FILE: code/pt_Br/04_capitulo/01_fatorial/main.dart
  function main (line 1) | void main()
  function fatorial (line 7) | int fatorial(int numero)

FILE: code/pt_Br/04_capitulo/02_escopo/main.dart
  function main (line 3) | void main()
  function a (line 5) | a()
  function b (line 8) | b()
  function c (line 14) | c()

FILE: code/pt_Br/04_capitulo/03_tipo_function/main.dart
  function main (line 6) | void main()

FILE: code/pt_Br/04_capitulo/04_retornos/main.dart
  function main (line 1) | void main()
  function retornoNulo (line 11) | retornoNulo()
  function retornoNuloDois (line 13) | retornoNuloDois()
  function retornoString (line 17) | retornoString()
  function semRetorno (line 21) | void semRetorno()
  function retornoVazio (line 23) | void retornoVazio()
  function retornoDynamic (line 27) | void retornoDynamic()
  function retornoFuncao (line 32) | void retornoFuncao()

FILE: code/pt_Br/04_capitulo/05_never/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/04_capitulo/06_escopo_closure/main.dart
  function criaClosure (line 1) | Function criaClosure()
  function main (line 9) | void main()

FILE: code/pt_Br/04_capitulo/07_tear_off/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/04_capitulo/08_parametro_posicional_obrigatorio/main.dart
  function temperaturaEm (line 2) | void temperaturaEm(String cidade, int? ano, int? mes, int dia)
  function main (line 6) | void main()

FILE: code/pt_Br/04_capitulo/09_parametro_posicional_opcional/main.dart
  function temperaturaEm (line 1) | void temperaturaEm(String cidade, [int? ano = 2020, int? mes, int dia = ...
  function main (line 5) | void main()

FILE: code/pt_Br/04_capitulo/10_parametro_nomeado_opcional/main.dart
  function temperaturaEm (line 1) | void temperaturaEm(String cidade, {int? ano = 2020, int dia = 01, int? m...
  function main (line 5) | void main()

FILE: code/pt_Br/04_capitulo/11_parametro_nomeado_obrigatorio/main.dart
  function temperaturaEm (line 1) | void temperaturaEm(String cidade,
  function main (line 6) | void main()

FILE: code/pt_Br/04_capitulo/12_enums/main.dart
  type Planeta (line 3) | enum Planeta {
  function main (line 27) | void main()

FILE: code/pt_Br/04_capitulo/13_typedef/main.dart
  type Operacao (line 1) | typedef Operacao = Object Function(double a, double b);
  function somar (line 3) | double somar(double a, double b)
  function subtrair (line 7) | String subtrair(double a, double b)
  function calcular (line 11) | Object calcular(double a, double b, Operacao operacao)
  function main (line 15) | void main()

FILE: code/pt_Br/05_capitulo/01_errors/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/05_capitulo/02_exceptions/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/05_capitulo/03_throw/main.dart
  function voar (line 1) | void voar()
  function ligarCarro (line 5) | void ligarCarro()
  function main (line 7) | void main()

FILE: code/pt_Br/05_capitulo/04_exception_customizada/main.dart
  class SemGasolinaException (line 1) | class SemGasolinaException implements Exception {
    method toString (line 6) | String toString()
  function ligarCarro (line 9) | void ligarCarro()
  function main (line 11) | void main()

FILE: code/pt_Br/05_capitulo/05_assert/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/05_capitulo/06_assert_x_error/main.dart
  function main (line 3) | void main()
  function calcularCircunferencia (line 11) | double calcularCircunferencia(double raio)
  function calcularCircunferenciaError (line 16) | double calcularCircunferenciaError(double raio)
  class Motorista (line 21) | class Motorista {
  class MotoristaError (line 30) | class MotoristaError {

FILE: code/pt_Br/05_capitulo/07_try_catch/main.dart
  function comer (line 1) | void comer()
  function main (line 3) | void main()

FILE: code/pt_Br/05_capitulo/08_try_catch_on/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/05_capitulo/09_try_catch_exception/main.dart
  function comer (line 1) | void comer()
  function main (line 3) | void main()

FILE: code/pt_Br/05_capitulo/10_try_catch_finally/main.dart
  function main (line 3) | void main()
  function abrirConexao (line 16) | void abrirConexao()
  function buscarDados (line 18) | void buscarDados()
  function fecharConexao (line 20) | void fecharConexao()

FILE: code/pt_Br/06_capitulo/01_codigo_ansi/main.dart
  function error (line 3) | void error(Object object)
  function main (line 7) | void main()

FILE: code/pt_Br/07_capitulo/01_analyzer/main.dart
  class pessoa (line 3) | class pessoa {
    method DizerOi (line 8) | void DizerOi()
  function main (line 13) | main()

FILE: code/pt_Br/07_capitulo/02_analyzer_linter/main.dart
  class pessoa (line 3) | class pessoa {
    method DizerOi (line 8) | void DizerOi()
  function main (line 13) | main()

FILE: code/pt_Br/07_capitulo/03_comments/main.dart
  function imprimirValor (line 2) | void imprimirValor()

FILE: code/pt_Br/08_capitulo/01_objeto/main.dart
  class Programador (line 1) | class Programador {
    method trabalhar (line 7) | void trabalhar()
  function main (line 10) | void main()

FILE: code/pt_Br/08_capitulo/02_to_string/main.dart
  class Programador (line 1) | class Programador {
    method trabalhar (line 7) | void trabalhar()
    method toString (line 10) | String toString()
  function main (line 13) | void main()

FILE: code/pt_Br/08_capitulo/03_equalidade/main.dart
  class Programador (line 1) | class Programador {
    method trabalhar (line 7) | void trabalhar()
    method toString (line 10) | String toString()
  function main (line 13) | void main()

FILE: code/pt_Br/08_capitulo/04_sobrescrita_operadores/main.dart
  class Programador (line 1) | class Programador {
    method trabalhar (line 7) | void trabalhar()
    method toString (line 10) | String toString()
  function main (line 19) | void main()

FILE: code/pt_Br/08_capitulo/05_construtor_padrao/main.dart
  class Programador (line 1) | class Programador {
    method trabalhar (line 18) | void trabalhar()
    method toString (line 21) | String toString()
  function main (line 30) | void main()

FILE: code/pt_Br/08_capitulo/06_construtor_nomeado/main.dart
  class Programador (line 1) | class Programador {
    method trabalhar (line 16) | void trabalhar()
    method toString (line 19) | String toString()
  function main (line 28) | void main()

FILE: code/pt_Br/08_capitulo/07_construtor_const/main.dart
  class LinguagemProgramacao (line 1) | class LinguagemProgramacao {
  function main (line 7) | void main()

FILE: code/pt_Br/08_capitulo/08_construtor_factory/main.dart
  class Programador (line 1) | class Programador {
    method imprimirCache (line 16) | imprimirCache()
  function main (line 21) | void main()

FILE: code/pt_Br/08_capitulo/09_encapsulamento/main.dart
  class Programador (line 11) | class Programador {
  function main (line 27) | void main()

FILE: code/pt_Br/08_capitulo/10_heranca/main.dart
  class Funcionario (line 1) | class Funcionario {
    method trabalhar (line 6) | void trabalhar()
  class Programador (line 11) | class Programador extends Funcionario {
  class Gerente (line 15) | class Gerente extends Funcionario {
  function main (line 19) | void main()

FILE: code/pt_Br/08_capitulo/11_polimorfismo/main.dart
  class Funcionario (line 1) | class Funcionario {
    method trabalhar (line 2) | void trabalhar()
  class Programador (line 7) | class Programador extends Funcionario {
    method trabalhar (line 9) | void trabalhar()
  class Gerente (line 14) | class Gerente extends Funcionario {
    method trabalhar (line 16) | void trabalhar()
  class Startup (line 22) | class Startup {
    method novoProjeto (line 27) | void novoProjeto()
  function main (line 32) | void main()

FILE: code/pt_Br/08_capitulo/12_classes_abstratas/main.dart
  class Funcionario (line 1) | abstract class Funcionario {
    method trabalhar (line 6) | void trabalhar()
  class Programador (line 9) | class Programador extends Funcionario {
    method trabalhar (line 13) | void trabalhar()
  class Gerente (line 18) | class Gerente extends Funcionario {
    method trabalhar (line 22) | void trabalhar()
  class Robo (line 27) | class Robo extends Funcionario {
    method trabalhar (line 31) | void trabalhar()
  class Assalariado (line 36) | class Assalariado {
    method receber (line 41) | void receber()
  class Startup (line 44) | class Startup {
    method novoProjeto (line 49) | void novoProjeto()
  function main (line 54) | void main()

FILE: code/pt_Br/08_capitulo/13_interfaces/main.dart
  class Assalariado (line 1) | abstract class Assalariado {
    method receber (line 6) | void receber()
  class Funcionario (line 9) | abstract class Funcionario {
    method trabalhar (line 13) | void trabalhar()
  class Programador (line 16) | class Programador extends Funcionario implements Assalariado {
    method trabalhar (line 25) | void trabalhar()
    method receber (line 30) | void receber()
  class Gerente (line 35) | class Gerente extends Funcionario implements Assalariado {
    method trabalhar (line 44) | void trabalhar()
    method receber (line 49) | void receber()
  class Robo (line 54) | class Robo extends Funcionario {
    method trabalhar (line 58) | void trabalhar()
  class Startup (line 63) | class Startup {
    method pagarFuncionarios (line 69) | void pagarFuncionarios()
  function main (line 74) | void main()

FILE: code/pt_Br/08_capitulo/14_mixins/main.dart
  function receber (line 4) | void receber()
  class Funcionario (line 9) | abstract class Funcionario {
    method trabalhar (line 13) | void trabalhar()
  class Programador (line 16) | class Programador extends Funcionario with Assalariado {
    method trabalhar (line 19) | void trabalhar()
  class Gerente (line 24) | class Gerente extends Funcionario with Assalariado {
    method trabalhar (line 28) | void trabalhar()
  class Robo (line 33) | class Robo extends Funcionario {
    method trabalhar (line 37) | void trabalhar()
  class Startup (line 42) | class Startup {
    method pagarFuncionarios (line 48) | void pagarFuncionarios()
  function main (line 53) | void main()

FILE: code/pt_Br/08_capitulo/15_mixins_a_fundo/main.dart
  class A (line 1) | abstract class A {
    method ola (line 2) | String ola()
  function ola (line 6) | String ola()
  function ola (line 10) | String ola()
  class D (line 13) | class D extends A with B, C {
    method dizerOla (line 14) | void dizerOla()
  function main (line 19) | void main()

FILE: code/pt_Br/08_capitulo/16_extension_methods/main.dart
  function capitalizar (line 1) | String capitalizar(String texto)
  function capitalizar (line 7) | String capitalizar()
  function main (line 17) | void main()

FILE: code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/main.dart
  function capitalizar (line 3) | String capitalizar(String texto)
  function main (line 8) | void main()

FILE: code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/strings_extension.dart
  function capitalizar (line 2) | String capitalizar()

FILE: code/pt_Br/08_capitulo/18_classe_wrapper/main.dart
  class Id (line 1) | class Id {
    method toString (line 9) | String toString()
  class Funcionario (line 12) | class Funcionario {
  function main (line 17) | void main()

FILE: code/pt_Br/08_capitulo/19_extension_types/main.dart
  class Funcionario (line 8) | class Funcionario {
  function main (line 13) | void main()

FILE: code/pt_Br/08_capitulo/20_modifiers_abstract/main.dart
  class A (line 1) | abstract class A {}
  class B (line 2) | class B extends A {}
  class C (line 3) | class C implements A {}

FILE: code/pt_Br/08_capitulo/21_modifiers_interface/arquivo.dart
  class A (line 1) | interface class A {}

FILE: code/pt_Br/08_capitulo/21_modifiers_interface/main.dart
  class B (line 4) | class B extends A {}
  class C (line 6) | class C implements A {}

FILE: code/pt_Br/08_capitulo/22_modifiers_base/arquivo.dart
  class A (line 1) | base class A {}

FILE: code/pt_Br/08_capitulo/22_modifiers_base/main.dart
  class B (line 4) | base class B extends A {}
  class C (line 8) | base class C implements A {}

FILE: code/pt_Br/08_capitulo/23_modifiers_final/arquivo.dart
  class A (line 1) | final class A {}

FILE: code/pt_Br/08_capitulo/23_modifiers_final/main.dart
  class B (line 4) | class B extends A {}
  class C (line 5) | class C implements A {}

FILE: code/pt_Br/08_capitulo/24_modifiers_sealed/main.dart
  class Poligono (line 1) | sealed class Poligono {}
  class Pentagono (line 2) | class Pentagono extends Poligono {}
  class Triangulo (line 3) | sealed class Triangulo extends Poligono {}
  class Isoceles (line 4) | class Isoceles extends Triangulo {}
  class Equilatero (line 5) | class Equilatero extends Triangulo {}
  class Quadrilatero (line 6) | sealed class Quadrilatero extends Poligono {}
  class Retangulo (line 7) | class Retangulo extends Quadrilatero {}
  function ladosPoligono (line 9) | int ladosPoligono(Poligono p)

FILE: code/pt_Br/09_capitulo/01_generics_1/main.dart
  class VeiculoAutomotor (line 1) | abstract class VeiculoAutomotor {}
  class Carro (line 3) | class Carro extends VeiculoAutomotor {}
  class Caminhao (line 5) | class Caminhao extends VeiculoAutomotor {}
  class FilaPedagio (line 7) | class FilaPedagio {
    method entrarNaFila (line 10) | void entrarNaFila(veiculo)
  function main (line 15) | void main()

FILE: code/pt_Br/09_capitulo/02_generics_2/main.dart
  class VeiculoAutomotor (line 1) | abstract class VeiculoAutomotor {}
  class Carro (line 3) | class Carro extends VeiculoAutomotor {}
  class Caminhao (line 5) | class Caminhao extends VeiculoAutomotor {}
  class FilaPedagioCarro (line 7) | class FilaPedagioCarro {
    method entrarNaFila (line 10) | void entrarNaFila(Carro veiculo)
  class FilaPedagioCaminhao (line 15) | class FilaPedagioCaminhao {
    method entrarNaFila (line 18) | void entrarNaFila(Caminhao veiculo)
  function main (line 25) | void main()

FILE: code/pt_Br/09_capitulo/03_generics_3/main.dart
  class VeiculoAutomotor (line 1) | abstract class VeiculoAutomotor {}
  class Carro (line 3) | class Carro extends VeiculoAutomotor {}
  class Caminhao (line 5) | class Caminhao extends VeiculoAutomotor {}
  class FilaPedagio (line 7) | class FilaPedagio<T> {
    method entrarNaFila (line 10) | void entrarNaFila(T veiculo)
  function main (line 18) | void main()

FILE: code/pt_Br/09_capitulo/04_generics_restringindo_tipo/main.dart
  class VeiculoAutomotor (line 1) | abstract class VeiculoAutomotor {}
  class Carro (line 3) | class Carro extends VeiculoAutomotor {}
  class Caminhao (line 5) | class Caminhao extends VeiculoAutomotor {}
  class FilaPedagio (line 7) | class FilaPedagio<T extends VeiculoAutomotor> {
    method entrarNaFila (line 10) | void entrarNaFila(T veiculo)
  class Bicicleta (line 15) | class Bicicleta {}
  function main (line 20) | void main()

FILE: code/pt_Br/09_capitulo/05_generics_metodos/main.dart
  function ultimo (line 1) | T ultimo<T extends num>(List<T> itens)
  function main (line 6) | void main()

FILE: code/pt_Br/09_capitulo/06_lists/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/07_iterando_lists/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/08_linked_hash_set/main.dart
  function main (line 5) | void main()

FILE: code/pt_Br/09_capitulo/09_hash_set/main.dart
  function main (line 5) | void main()

FILE: code/pt_Br/09_capitulo/10_splay_tree_set/main.dart
  function main (line 5) | void main()

FILE: code/pt_Br/09_capitulo/11_queue/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/09_capitulo/12_map/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/09_capitulo/13_records/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/14_records_tipados/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/15_records_equalidade/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/16_records_retorno_funcao/main.dart
  function main (line 1) | void main()
  type Comprovante (line 10) | typedef Comprovante = (String chave, double valor, {DateTime hora});
  function comprovanteTransacao (line 11) | Comprovante comprovanteTransacao()

FILE: code/pt_Br/09_capitulo/17_pattern_matching/main.dart
  function main (line 1) | void main()
  class Cliente (line 27) | class Cliente {

FILE: code/pt_Br/09_capitulo/18_pattern_destructuring/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/19_pattern_for_looping/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/09_capitulo/20_pattern_collection_literal/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/10_capitulo/01_event_loop/main.dart
  function main (line 2) | void main ()

FILE: code/pt_Br/10_capitulo/02_programa_sincrono_1/main.dart
  function main (line 1) | void main ()

FILE: code/pt_Br/10_capitulo/03_programa_sincrono_2/main.dart
  function main (line 3) | void main()
  function temperaturaAtual (line 8) | String temperaturaAtual()
  function previsaoAmanha (line 13) | String previsaoAmanha()

FILE: code/pt_Br/10_capitulo/04_future/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/10_capitulo/05_future_encadeado/main.dart
  function main (line 1) | void main()
  function buscarId (line 9) | Future<int> buscarId()
  function buscarNome (line 13) | Future<String> buscarNome(int id)

FILE: code/pt_Br/10_capitulo/06_erro_cadeia_assincrona/main.dart
  function um (line 1) | Future<String> um()
  function dois (line 2) | Future<String> dois()
  function tres (line 3) | Future<String> tres()
  function main (line 5) | void main()

FILE: code/pt_Br/10_capitulo/07_erro_cadeia_try_catch/main.dart
  function um (line 1) | Future<String> um()
  function dois (line 3) | Future<String> dois()
  function tres (line 5) | Future<String> tres()
  function main (line 7) | void main()

FILE: code/pt_Br/10_capitulo/08_erro_cadeia_catch_error/main.dart
  function um (line 1) | Future<String> um()
  function dois (line 3) | Future<String> dois()
  function tres (line 5) | Future<String> tres()
  function main (line 7) | void main()

FILE: code/pt_Br/10_capitulo/09_erro_cadeia_on_error/main.dart
  function um (line 1) | Future<String> um()
  function dois (line 3) | Future<String> dois()
  function tres (line 5) | Future<String> tres()
  function main (line 7) | void main()

FILE: code/pt_Br/10_capitulo/10_future_sync/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/10_capitulo/11_future_microtask/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/10_capitulo/12_future_value/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/10_capitulo/13_future_error/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/10_capitulo/14_future_wait/main.dart
  function main (line 1) | void main()
  function listaFuture (line 6) | List<Future<String>> listaFuture()
  function comErro (line 10) | Future<String> comErro()

FILE: code/pt_Br/10_capitulo/15_future_any/main.dart
  function main (line 1) | void main()
  function listaFuture (line 6) | List<Future<String>> listaFuture()
  function comErro (line 10) | Future<String> comErro()

FILE: code/pt_Br/10_capitulo/16_async_await/main.dart
  function main (line 1) | void main()
  function resposta (line 6) | resposta()

FILE: code/pt_Br/10_capitulo/17_async_await_fluxo/main.dart
  function main (line 1) | void main()
  function resposta (line 7) | Future<int> resposta()

FILE: code/pt_Br/10_capitulo/18_async_await_x_future/main.dart
  function buscarNomeUsuario (line 1) | Future<String> buscarNomeUsuario()
  function buscarNomeUsuarioAsync (line 9) | Future<String> buscarNomeUsuarioAsync()
  function main (line 15) | main()
  function buscarId (line 23) | Future<int> buscarId()
  function buscarNome (line 25) | Future<String> buscarNome(int id)

FILE: code/pt_Br/10_capitulo/19_async_await_erro/main.dart
  function main (line 1) | void main()
  function buscarId (line 6) | Future<int> buscarId()

FILE: code/pt_Br/10_capitulo/20_completer_future/main.dart
  class Database (line 3) | class Database {
    method salvarUsuario (line 4) | void salvarUsuario(String usuario, void Function(String) callback)
  class FutureDatabase (line 11) | class FutureDatabase {
    method salvarUsuario (line 12) | Future<String> salvarUsuario(String usuario)
  function main (line 21) | Future<void> main()
  function callbackUsuario (line 27) | void callbackUsuario(String resultado)

FILE: code/pt_Br/10_capitulo/21_completer_flexibilidade/main.dart
  class CompletoComNumero (line 4) | class CompletoComNumero {
    method sorteio (line 13) | Stream<int> sorteio()
    method _validarNumero (line 28) | void _validarNumero(int numeroSorteado)
    method novo (line 34) | Future<String> novo(int numero)
  function main (line 40) | void main()

FILE: code/pt_Br/11_capitulo/01_dart_args/main.dart
  function main (line 3) | void main(List<String> args)

FILE: code/pt_Br/11_capitulo/02_dart_http/main.dart
  function main (line 2) | void main(List<String> args)

FILE: code/pt_Br/11_capitulo/03_dart_convert/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/01_stream_subscription/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/02_stream_subscription_varios_dados/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/03_stream_subscription_callbacks/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/04_inscricao_unica_listener/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/05_broadcast_listener/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/06_stream_controller/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/07_stream_controller_sink/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/08_stream_consumer/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/09_stream_consumer_2/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/10_stream_sink_close/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/11_stream_sink_x_stream_controller/main.dart
  function acessaSink (line 3) | void acessaSink(StreamSink sink)
  function main (line 10) | void main()

FILE: code/pt_Br/12_capitulo/12_controller_callback_inscricao_unica/main.dart
  function dispararEventos (line 3) | void dispararEventos(StreamController controller)
  function main (line 17) | void main()

FILE: code/pt_Br/12_capitulo/13_controller_callback_broadcast/main.dart
  function dispararEventos (line 3) | void dispararEventos(StreamController controller)
  function criarInscricao (line 17) | void criarInscricao(StreamController<int> controller, int valor)
  function main (line 36) | void main()

FILE: code/pt_Br/12_capitulo/14_stream_await/main.dart
  function main (line 10) | Future<void> main()

FILE: code/pt_Br/12_capitulo/15_stream_await_error/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/16_stream_await_sem_encerramento/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/17_stream_propriedades/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/18_stream_metodos_busca/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/19_stream_metodos_validacao/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/20_as_broadcast_stream/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/21_distinct/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/22_map/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/23_expand/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/24_async_map/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/25_async_expand/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/26_skip/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/27_skip_while/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/28_take/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/29_take_while/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/30_where/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/31_timeout/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/32_to_list_to_set/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/33_drain/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/34_for_each/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/35_fold/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/36_reduce/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/37_join/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/12_capitulo/38_cast/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/39_handle_error/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/12_capitulo/40_pipe/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/13_capitulo/01_interface_stream_transformer/main.dart
  class AlfabetoTransformer (line 3) | class AlfabetoTransformer implements StreamTransformer<String, String> {
    method _onListen (line 23) | void _onListen()
    method _onCancel (line 28) | void _onCancel()
    method _onData (line 32) | void _onData(String dado)
    method bind (line 41) | Stream<String> bind(Stream<String> stream)
    method cast (line 47) | StreamTransformer<RS, RT> cast<RS, RT>()
  function main (line 50) | void main()

FILE: code/pt_Br/13_capitulo/02_construtor_stream_transformer/main.dart
  function criarTransformer (line 3) | StreamTransformer<String, String> criarTransformer({
  function main (line 32) | void main()

FILE: code/pt_Br/13_capitulo/03_stream_transformer_base/main.dart
  class AlfabetoTransformer (line 3) | class AlfabetoTransformer extends StreamTransformerBase<String, String> {
    method bind (line 11) | Stream<String> bind(Stream<String> stream)
    method criarTransformer (line 13) | StreamTransformer<String, String> criarTransformer(
  function main (line 42) | void main()

FILE: code/pt_Br/13_capitulo/04_stream_transformer_from_handlers/main.dart
  function criarTransformer (line 3) | StreamTransformer<String, String> criarTransformer({
  function main (line 22) | void main()

FILE: code/pt_Br/13_capitulo/05_stream_transformer_from_bind/main.dart
  class AlfabetoTransformer (line 3) | class AlfabetoTransformer extends StreamTransformerBase<String, String> {
    method bind (line 11) | Stream<String> bind(Stream<String> stream)
    method criarTransformer (line 13) | StreamTransformer<String, String> criarTransformer(
  function main (line 47) | void main()

FILE: code/pt_Br/13_capitulo/06_problema_inscricao_unica/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/13_capitulo/07_sem_perda_eventos/main.dart
  function main (line 13) | void main()

FILE: code/pt_Br/13_capitulo/08_perda_eventos_broadcast/main.dart
  function main (line 13) | void main()

FILE: code/pt_Br/13_capitulo/09_broadcast_subscription_buffer/main.dart
  function main (line 13) | void main()

FILE: code/pt_Br/13_capitulo/10_geradores_sincronos_yield/main.dart
  function numeros (line 3) | Iterable<int> numeros()
  function main (line 12) | void main()

FILE: code/pt_Br/13_capitulo/11_geradores_sincronos_yield_*/main.dart
  function letrasNumeros (line 1) | Iterable<dynamic> letrasNumeros()
  function letras (line 6) | Iterable<String> letras()
  function main (line 10) | void main()

FILE: code/pt_Br/13_capitulo/12_geradores_assincronos_yield/main.dart
  function numeros (line 1) | Stream<int> numeros()
  function main (line 10) | void main()

FILE: code/pt_Br/13_capitulo/13_geradores_assincronos_yield_*/main.dart
  function letrasNumeros (line 1) | Stream<dynamic> letrasNumeros()
  function letras (line 6) | Stream<String> letras()
  function main (line 10) | void main()

FILE: code/pt_Br/13_capitulo/14_server/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/01_isolate/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/02_nova_isolate/main.dart
  function main (line 3) | void main()
  function funcaoEntrada (line 13) | void funcaoEntrada(String parametro)

FILE: code/pt_Br/14_capitulo/03_unidirecional_unica/main.dart
  function main (line 3) | void main()
  function workerIsolate (line 9) | void workerIsolate(SendPort sendPort)

FILE: code/pt_Br/14_capitulo/04_unidirecional_frequente/main.dart
  function main (line 4) | void main()
  function workerIsolate (line 12) | void workerIsolate(SendPort sendPort)

FILE: code/pt_Br/14_capitulo/05_bidirecional/main.dart
  function isolateBidirecional (line 4) | Future<SendPort> isolateBidirecional(
  function novaIsolate (line 19) | void novaIsolate(SendPort sendPort)
  function main (line 33) | void main()

FILE: code/pt_Br/14_capitulo/06_controle_isolate/main.dart
  function main (line 4) | void main()
  function novaIsolate (line 23) | void novaIsolate(SendPort sendPort)

FILE: code/pt_Br/14_capitulo/07_isolate_listeners/main.dart
  function main (line 4) | void main()
  function novaIsolate (line 19) | void novaIsolate(SendPort sendPort)

FILE: code/pt_Br/14_capitulo/08_spawn_uri/isolate.dart
  function main (line 3) | void main(List<String> args, SendPort sendPort)

FILE: code/pt_Br/14_capitulo/08_spawn_uri/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/09_isolate_run/main.dart
  function main (line 4) | void main()

FILE: code/pt_Br/14_capitulo/10_zone_root/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/11_nova_zone/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/12_run_zoned/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/13_hierarquia_zones/main.dart
  function main (line 3) | void main()
  function a (line 12) | a()
  function b (line 14) | b(valor)
  function c (line 16) | c(valor)

FILE: code/pt_Br/14_capitulo/14_zone_livre_erros/main.dart
  function main (line 3) | void main()
  function mainZonedGuarded (line 11) | void mainZonedGuarded()

FILE: code/pt_Br/14_capitulo/15_propagacao_erros_zones/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/16_propagacao_erros_zones_2/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/17_propagacao_erros_zones_3/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/14_capitulo/18_valores_locais_zones/main.dart
  function main (line 3) | void main()
  function logZone (line 23) | void logZone()

FILE: code/pt_Br/14_capitulo/19_zone_specification/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/15_capitulo/01_criacao_diretorio/main.dart
  function main (line 3) | Future<void> main()

FILE: code/pt_Br/15_capitulo/02_remocao_diretorio/main.dart
  function main (line 3) | Future<void> main()

FILE: code/pt_Br/15_capitulo/03_criacao_arquivo/main.dart
  function main (line 3) | Future<void> main()

FILE: code/pt_Br/15_capitulo/04_escrita_arquivo/main.dart
  function main (line 4) | Future<void> main()

FILE: code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/main.dart
  function main (line 3) | Future<void> main()
  function gerarStream (line 13) | Stream<String> gerarStream()

FILE: code/pt_Br/15_capitulo/06_ler_arquivo/main.dart
  function main (line 4) | Future<void> main()

FILE: code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/main.dart
  function main (line 4) | Future<void> main()

FILE: code/pt_Br/e_com_voce/02_imc/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/e_com_voce/03_benchmark_strings/main.dart
  function main (line 12) | void main()
  function medir (line 19) | Duration medir(Function fn)
  function usarStringBuffer (line 26) | void usarStringBuffer()
  function usarConcatenacao (line 37) | void usarConcatenacao()

FILE: code/pt_Br/e_com_voce/03_circunferencia/main.dart
  function main (line 8) | void main()
  class A (line 26) | class A {

FILE: code/pt_Br/e_com_voce/03_regex_cpf/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao/main.dart
  function main (line 3) | main()
  function fatorial (line 11) | int fatorial(int numero)

FILE: code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao_closure/main.dart
  function main (line 3) | main()
  function calcularFatorial (line 11) | int calcularFatorial(int numero)
  function fatorial (line 12) | int fatorial(int numero)

FILE: code/pt_Br/e_com_voce/05_try_catch_rethrow/main.dart
  function main (line 1) | void main()
  function buscarUsuario (line 11) | void buscarUsuario()
  function buscarUsuarioCache (line 28) | void buscarUsuarioCache()
  function buscarUsuarioBancoDados (line 32) | void buscarUsuarioBancoDados()
  class CacheException (line 34) | class CacheException implements Exception {

FILE: code/pt_Br/e_com_voce/08_construtor_inicializadores/main.dart
  class Circunferencia (line 3) | class Circunferencia {
  class Subclasse (line 12) | class Subclasse extends Circunferencia {
  function main (line 17) | void main()

FILE: code/pt_Br/e_com_voce/08_redirecionando_construtores/main.dart
  class Coordenada (line 1) | class Coordenada {
    method toString (line 15) | String toString()
  function main (line 20) | void main()

FILE: code/pt_Br/e_com_voce/08_singleton/main.dart
  class SingletonUm (line 2) | class SingletonUm {
  class SingletonDois (line 13) | class SingletonDois {
  class SingletonTres (line 24) | class SingletonTres {
  function main (line 30) | void main()

FILE: code/pt_Br/e_com_voce/09_bidirectional_iterator/main.dart
  class BidirectionalIteratorList (line 2) | class BidirectionalIteratorList<E> {
    method moveNext (line 15) | bool moveNext()
    method movePrevious (line 27) | bool movePrevious()
  function main (line 40) | void main()

FILE: code/pt_Br/e_com_voce/09_programador_comparable/main.dart
  class Programador (line 1) | class Programador implements Comparable<Programador> {
    method trabalhar (line 9) | void trabalhar()
    method compareTo (line 11) | int compareTo(Programador other)
    method toString (line 16) | String toString()
  function main (line 19) | void main()

FILE: code/pt_Br/e_com_voce/09_teoria_conjuntos_set/main.dart
  function main (line 1) | void main()

FILE: code/pt_Br/e_com_voce/10_microtask_infinita/main.dart
  function main (line 8) | main()
  function criarMicrotask (line 15) | criarMicrotask()

FILE: code/pt_Br/e_com_voce/13_gerador_divisores/main.dart
  function divisores (line 3) | Stream<int> divisores(int numero)
  function main (line 9) | Future<void> main()

FILE: code/pt_Br/e_com_voce/13_gerador_valores_impar/main.dart
  function numerosImpar (line 1) | Stream<int> numerosImpar()
  function main (line 7) | Future<void> main()

FILE: code/pt_Br/e_com_voce/13_stream_transformer_email/main.dart
  function transformerEmail (line 6) | StreamTransformer<String, String> transformerEmail()
  function main (line 24) | void main()

FILE: code/pt_Br/e_com_voce/13_stream_transformer_telefone/main.dart
  function transformerTelefone (line 6) | StreamTransformer<String, String> transformerTelefone()
  function main (line 24) | void main()

FILE: code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/main.dart
  function main (line 5) | void main(args)
  function novaIsolate (line 15) | void novaIsolate(SendPort sPort)

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/bin/climatempo.dart
  function main (line 10) | void main(List<String> args)
  function executar (line 20) | Future<void> executar(List<String> args)
  function registrarCidadeEBuscarTempo (line 54) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 59) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 68) | ArgParser criarParser()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/log.dart
  function _validarDiretorio (line 9) | Future<void> _validarDiretorio({String? dirPath})
  function salvarTempoIsolate (line 16) | Future<void> salvarTempoIsolate(ClimaTempo climaTempo)
  function salvarTempo (line 21) | Future<void> salvarTempo(ClimaTempo climaTempo)
  function _registrarCallbackFinalizacao (line 33) | void _registrarCallbackFinalizacao(Isolate isolate)
  function salvarCidadesIsolate (line 43) | Future<void> salvarCidadesIsolate(List<Cidade> cidades)
  function salvarCidades (line 48) | Future<void> salvarCidades(List<Cidade> cidades)
  function salvarErro (line 63) | Future<void> salvarErro(Object erro, StackTrace stackTrace,
  function _doisDigitos (line 80) | String _doisDigitos(int numero)

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/bin/climatempo.dart
  function main (line 10) | void main(List<String> args)
  function executar (line 20) | Future<void> executar(List<String> args)
  function registrarCidadeEBuscarTempo (line 54) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 59) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 68) | ArgParser criarParser()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/log.dart
  function _validarDiretorio (line 9) | Future<void> _validarDiretorio()
  function salvarTempoIsolate (line 16) | Future<void> salvarTempoIsolate(ClimaTempo climaTempo)
  function salvarTempo (line 35) | Future<void> salvarTempo(ClimaTempo climaTempo)
  function _registrarCallbackFinalizacao (line 41) | void _registrarCallbackFinalizacao(Isolate isolate)
  function salvarCidadesIsolate (line 51) | Future<void> salvarCidadesIsolate(List<Cidade> cidades)
  function salvarCidades (line 70) | Future<void> salvarCidades(List<Cidade> cidades)
  function salvarErro (line 79) | Future<void> salvarErro(Object erro, StackTrace stackTrace,
  function _doisDigitos (line 96) | String _doisDigitos(int numero)

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/bin/climatempo.dart
  function main (line 10) | void main(List<String> args)
  function executar (line 20) | Future<void> executar(List<String> args)
  function registrarCidadeEBuscarTempo (line 54) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 59) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 68) | ArgParser criarParser()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/log.dart
  function _validarDiretorio (line 9) | Future<void> _validarDiretorio()
  function salvarTempoIsolate (line 16) | Future<void> salvarTempoIsolate(ClimaTempo climaTempo)
  function salvarTempo (line 21) | Future<void> salvarTempo(ClimaTempo climaTempo)
  function _registrarCallbackFinalizacao (line 33) | void _registrarCallbackFinalizacao(Isolate isolate)
  function salvarCidadesIsolate (line 43) | Future<void> salvarCidadesIsolate(List<Cidade> cidades)
  function salvarCidades (line 48) | Future<void> salvarCidades(List<Cidade> cidades)
  function salvarErro (line 63) | Future<void> salvarErro(Object erro, StackTrace stackTrace,
  function _doisDigitos (line 80) | String _doisDigitos(int numero)

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/na_pratica/03_strings_palindromo/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/lib/src/partida.dart
  class Partida (line 13) | class Partida {
    method criarRegra (line 16) | void criarRegra(String vencedor,
    method escolherPc (line 24) | String escolherPc()
    method iniciar (line 29) | Resumo iniciar({required String humano})
  function configurarPartida (line 46) | Partida configurarPartida()

FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/lib/src/resultado.dart
  type Resultado (line 1) | enum Resultado {
  class Resumo (line 12) | class Resumo {

FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/main.dart
  function main (line 12) | void main()
  function mostrarResultado (line 35) | void mostrarResultado(Resumo resumo)
  function adicionarEspaco (line 52) | void adicionarEspaco()
  function jogarNovamente (line 57) | void jogarNovamente(web.MouseEvent e)
  function inicializarReferencias (line 64) | void inicializarReferencias()

FILE: code/pt_Br/na_pratica/06_logger_library/lib/log/log.dart
  type _Cores (line 7) | enum _Cores {
  type Nivel (line 19) | enum Nivel { info, warning, error }
  class Logger (line 21) | class Logger {
    method info (line 30) | void info(Object object)
    method warning (line 34) | void warning(Object object)
    method error (line 39) | void error(Object object)
    method _habilitado (line 44) | bool _habilitado(Nivel nivelHabilitado)

FILE: code/pt_Br/na_pratica/06_logger_library/lib/log/printer.dart
  class Printer (line 3) | class Printer {
    method _log (line 9) | void _log(_Cores cor, Object object)

FILE: code/pt_Br/na_pratica/06_logger_library/lib/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/docs.dart.js
  function copyProperties (line 1) | function copyProperties(a,b){var s=Object.keys(a)
  function mixinPropertiesHard (line 3) | function mixinPropertiesHard(a,b){var s=Object.keys(a)
  function mixinPropertiesEasy (line 5) | function mixinPropertiesEasy(a,b){Object.assign(b,a)}
  function inherit (line 12) | function inherit(a,b){a.prototype.constructor=a
  function inheritMany (line 17) | function inheritMany(a,b){for(var s=0;s<b.length;s++){inherit(b[s],a)}}
  function mixinEasy (line 17) | function mixinEasy(a,b){mixinPropertiesEasy(b.prototype,a.prototype)
  function mixinHard (line 18) | function mixinHard(a,b){mixinPropertiesHard(b.prototype,a.prototype)
  function lazy (line 19) | function lazy(a,b,c,d){var s=a
  function lazyFinal (line 22) | function lazyFinal(a,b,c,d){var s=a
  function makeConstList (line 27) | function makeConstList(a){a.immutable$list=Array
  function convertToFastObject (line 29) | function convertToFastObject(a){function t(){}t.prototype=a
  function convertAllToFastObject (line 31) | function convertAllToFastObject(a){for(var s=0;s<a.length;++s){convertTo...
  function instanceTearOffGetter (line 32) | function instanceTearOffGetter(a,b){var s=null
  function staticTearOffGetter (line 35) | function staticTearOffGetter(a){var s=null
  function tearOffParameters (line 38) | function tearOffParameters(a,b,c,d,e,f,g,h,i,j){if(typeof h=="number"){h...
  function installStaticTearOff (line 38) | function installStaticTearOff(a,b,c,d,e,f,g,h){var s=tearOffParameters(a...
  function installInstanceTearOff (line 40) | function installInstanceTearOff(a,b,c,d,e,f,g,h,i,j){c=!!c
  function setOrUpdateInterceptorsByTag (line 43) | function setOrUpdateInterceptorsByTag(a){var s=v.interceptorsByTag
  function setOrUpdateLeafTags (line 45) | function setOrUpdateLeafTags(a){var s=v.leafTags
  function updateTypes (line 47) | function updateTypes(a){var s=v.types
  function updateHolder (line 50) | function updateHolder(a,b){copyProperties(b,a)
  function initializeDeferredHunk (line 53) | function initializeDeferredHunk(a){x=v.types.length
  method eJ (line 55) | eJ(a,b,c,d){return{i:a,p:b,e:c,x:d}}
  method eG (line 56) | eG(a){var s,r,q,p,o,n=a[v.dispatchPropertyName]
  method hQ (line 78) | hQ(a,b){if(a<0||a>4294967295)throw A.a(A.H(a,0,4294967295,"length",null))
  method hR (line 80) | hR(a,b){if(a<0)throw A.a(A.a_("Length must be a non-negative integer: "+...
  method eX (line 82) | eX(a,b){if(a<0)throw A.a(A.a_("Length must be a non-negative integer: "+...
  method hS (line 84) | hS(a,b){return J.eg(A.h(a,b.i("o<0>")))}
  method eg (line 85) | eg(a){a.fixed$length=Array
  method eY (line 87) | eY(a){a.fixed$length=Array
  method hT (line 90) | hT(a,b){return J.hu(a,b)}
  method X (line 91) | X(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.aP.prototype
  method ao (line 101) | ao(a){if(typeof a=="string")return J.ai.prototype
  method e_ (line 109) | e_(a){if(a==null)return a
  method jJ (line 116) | jJ(a){if(typeof a=="number")return J.aR.prototype
  method F (line 121) | F(a,b){if(a==null)return b==null
  method hr (line 124) | hr(a,b){if(typeof b==="number")if(Array.isArray(a)||typeof a=="string"||...
  method hs (line 126) | hs(a,b,c){if(typeof b==="number")if((Array.isArray(a)||A.h4(a,a[v.dispat...
  method ht (line 128) | ht(a,b){return J.e_(a).X(a,b)}
  method hu (line 129) | hu(a,b){return J.jJ(a).aL(a,b)}
  method hv (line 130) | hv(a,b){return J.ao(a).ag(a,b)}
  method ef (line 131) | ef(a,b){return J.e_(a).E(a,b)}
  method Z (line 132) | Z(a){return J.X(a).gn(a)}
  method L (line 133) | L(a){return J.e_(a).gB(a)}
  method aI (line 134) | aI(a){return J.ao(a).gl(a)}
  method hw (line 135) | hw(a){return J.X(a).gt(a)}
  method hx (line 136) | hx(a,b){return J.X(a).b_(a,b)}
  method aq (line 137) | aq(a){return J.X(a).h(a)}
  method hA (line 160) | hA(a,b,c){if(b.i("c<0>").b(a))return new A.b9(a,b.i("@<0>").A(c).i("b9<1...
  method e0 (line 162) | e0(a){var s,r=a^48
  method a6 (line 167) | a6(a,b){a=a+b&536870911
  method en (line 170) | en(a){a=a+((a&67108863)<<3)&536870911
  method cn (line 173) | cn(a,b,c){return a}
  method eI (line 174) | eI(a){var s,r
  method hW (line 177) | hW(a,b,c,d){if(t.U.b(a))return new A.aM(a,b,c.i("@<0>").A(d).i("aM<1,2>"))
  method eV (line 179) | eV(){return new A.b5("No element")}
  method hG (line 220) | hG(){throw A.a(A.T("Cannot modify unmodifiable Map"))}
  method h9 (line 221) | h9(a){var s=v.mangledGlobalNames[a]
  method h4 (line 224) | h4(a,b){var s
  method i (line 227) | i(a){var s
  method bY (line 234) | bY(a){var s,r=$.f2
  method f3 (line 239) | f3(a,b){var s,r,q,p,o,n=null,m=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+...
  method cQ (line 249) | cQ(a){return A.i0(a)}
  method i0 (line 250) | i0(a){var s,r,q,p
  method f4 (line 258) | f4(a){if(a==null||typeof a=="number"||A.ez(a))return J.aq(a)
  method i3 (line 263) | i3(a,b,c){var s,r,q,p
  method Q (line 268) | Q(a){var s
  method a3 (line 272) | a3(a,b,c){var s,r,q={}
  method i1 (line 281) | i1(a,b,c){var s,r,q
  method i_ (line 288) | i_(a,b,c){var s,r,q,p,o,n,m,l,k,j,i,h,g=Array.isArray(b)?b:A.bL(b,!0,t.z...
  method i2 (line 313) | i2(a){var s=a.$thrownJsError
  method eF (line 316) | eF(a,b){var s,r="index"
  method jG (line 321) | jG(a,b,c){if(a>c)return A.H(a,0,c,"start",null)
  method jz (line 324) | jz(a){return new A.G(!0,a,null,null)}
  method a (line 325) | a(a){return A.h3(new Error(),a)}
  method h3 (line 326) | h3(a,b){var s
  method k5 (line 333) | k5(){return J.aq(this.dartException)}
  method aH (line 334) | aH(a){throw A.a(a)}
  method h8 (line 335) | h8(a,b){throw A.h3(b,a)}
  method co (line 336) | co(a){throw A.a(A.as(a))}
  method S (line 337) | S(a){var s,r,q,p,o,n
  method cV (line 347) | cV(a){return function($expr$){var $argumentsExpr$="$arguments$"
  method fd (line 349) | fd(a){return function($expr$){try{$expr$.$method$}catch(s){return s.mess...
  method ei (line 350) | ei(a,b){var s=b==null,r=s?null:b.method
  method ae (line 352) | ae(a){if(a==null)return new A.cO(a)
  method ad (line 357) | ad(a,b){if(t.Q.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a
  method jy (line 359) | jy(a){var s,r,q,p,o,n,m,l,k,j,i,h,g
  method ac (line 384) | ac(a){var s
  method h5 (line 392) | h5(a){if(a==null)return J.Z(a)
  method jI (line 395) | jI(a,b){var s,r,q,p=a.length
  method jb (line 399) | jb(a,b,c,d,e,f){switch(b){case 0:return a.$0()
  method aF (line 404) | aF(a,b){var s=a.$identity
  method jE (line 409) | jE(a,b){var s
  method hF (line 422) | hF(a2){var s,r,q,p,o,n,m,l,k,j,i=a2.co,h=a2.iS,g=a2.iI,f=a2.nDA,e=a2.aI,...
  method hB (line 446) | hB(a,b,c){if(typeof a=="number")return a
  method hC (line 449) | hC(a,b,c,d){var s=A.eS
  method eT (line 457) | eT(a,b,c,d){if(c)return A.hE(a,b,d)
  method hD (line 459) | hD(a,b,c,d){var s=A.eS,r=A.hz
  method hE (line 470) | hE(a,b,c){var s,r
  method eE (line 476) | eE(a){return A.hF(a)}
  method hy (line 477) | hy(a,b){return A.bl(v.typeUniverse,A.aG(a.a),b)}
  method eS (line 478) | eS(a){return a.a}
  method hz (line 479) | hz(a){return a.b}
  method eP (line 480) | eP(a){var s,r,q,p=new A.aJ("receiver","interceptor"),o=J.eg(Object.getOw...
  method kH (line 483) | kH(a){throw A.a(new A.c8(a))}
  method jK (line 484) | jK(a){return v.getIsolateTag(a)}
  method jV (line 485) | jV(a){var s,r,q,p,o,n=$.h2.$1(a),m=$.dZ[n]
  method h6 (line 510) | h6(a,b){var s=Object.getPrototypeOf(a)
  method ea (line 513) | ea(a){return J.eJ(a,!1,null,!!a.$iD)}
  method jX (line 514) | jX(a,b,c){var s=b.prototype
  method jQ (line 517) | jQ(){if(!0===$.eH)return
  method jR (line 520) | jR(){var s,r,q,p,o,n,m,l
  method jP (line 539) | jP(){var s,r,q,p,o,n,m=B.y()
  method aE (line 550) | aE(a,b){return a(b)||b}
  method jF (line 551) | jF(a,b){var s=b.length,r=v.rttc[""+s+";"+a]
  method eZ (line 556) | eZ(a,b,c,d,e,f){var s=b?"m":"",r=c?"":"i",q=d?"u":"",p=e?"s":"",o=f?"g":...
  method k2 (line 559) | k2(a,b,c){var s=a.indexOf(b,c)
  method k_ (line 561) | k_(a){if(/[[\]{}()*+?.\\^$|]/.test(a))return a.replace(/[[\]{}()*+?.\\^$...
  method fX (line 563) | fX(a){return a}
  method k3 (line 564) | k3(a,b,c,d){var s,r,q,p=new A.d3(b,a,0),o=t.F,n=0,m=""
  method j0 (line 646) | j0(a){return a}
  method hX (line 647) | hX(a){return new Int8Array(a)}
  method hY (line 648) | hY(a){return new Uint8Array(a)}
  method V (line 649) | V(a,b,c){if(a>>>0!==a||a>=c)throw A.a(A.eF(b,a))}
  method iX (line 650) | iX(a,b,c){var s
  method f7 (line 674) | f7(a,b){var s=b.c
  method em (line 676) | em(a,b){var s=b.c
  method f8 (line 678) | f8(a){var s=a.w
  method i5 (line 681) | i5(a){return a.as}
  method bt (line 682) | bt(a){return A.ck(v.typeUniverse,a,!1)}
  method aa (line 683) | aa(a1,a2,a3,a4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=a2.w
  method aD (line 731) | aD(a,b,c,d){var s,r,q,p,o=b.length,n=A.dI(o)
  method jw (line 736) | jw(a,b,c,d){var s,r,q,p,o,n,m=b.length,l=A.dI(m)
  method jv (line 743) | jv(a,b,c,d){var s,r=b.a,q=A.aD(a,r,c,d),p=b.b,o=A.aD(a,p,c,d),n=b.c,m=A....
  method h (line 750) | h(a,b){a[v.arrayRti]=b
  method h1 (line 752) | h1(a){var s=a.$S
  method jS (line 755) | jS(a,b){var s
  method aG (line 758) | aG(a){if(a instanceof A.l)return A.E(a)
  method am (line 761) | am(a){var s=a[v.arrayRti],r=t.b
  method E (line 765) | E(a){var s=a.$ti
  method ey (line 767) | ey(a){var s=a.constructor,r=s.$ccache
  method j9 (line 770) | j9(a,b){var s=a instanceof A.ag?Object.getPrototypeOf(Object.getPrototyp...
  method jM (line 773) | jM(a){var s,r=v.types,q=r[a]
  method jL (line 777) | jL(a){return A.an(A.E(a))}
  method eC (line 778) | eC(a){var s
  method an (line 785) | an(a){var s=a.r
  method fL (line 787) | fL(a){var s,r,q=a.as,p=q.replace(/\*/g,"")
  method jH (line 792) | jH(a,b){var s,r,q=b,p=q.length
  method K (line 797) | K(a){return A.an(A.ck(v.typeUniverse,a,!1))}
  method j8 (line 798) | j8(a){var s,r,q,p,o,n,m=this
  method W (line 819) | W(a,b,c){a.b=c
  method j7 (line 821) | j7(a){var s,r=this,q=A.j1
  method cm (line 829) | cm(a){var s,r=a.w
  method j2 (line 837) | j2(a){var s=this
  method j4 (line 840) | j4(a){if(a==null)return!0
  method jj (line 842) | jj(a){var s,r=this
  method je (line 847) | je(a){var s,r=this
  method j1 (line 854) | j1(a){var s=this
  method j3 (line 857) | j3(a){var s=this
  method fM (line 861) | fM(a,b){throw A.a(A.ip(A.fi(a,A.C(b,null))))}
  method fi (line 862) | fi(a,b){return A.at(a)+": type '"+A.C(A.eC(a),null)+"' is not a subtype ...
  method ip (line 863) | ip(a){return new A.bh("TypeError: "+a)}
  method B (line 864) | B(a,b){return new A.bh("TypeError: "+A.fi(a,b))}
  method jc (line 865) | jc(a){var s=this,r=s.w===6?s.x:s
  method jg (line 867) | jg(a){return a!=null}
  method iS (line 868) | iS(a){if(a!=null)return a
  method jk (line 870) | jk(a){return!0}
  method iU (line 871) | iU(a){return a}
  method fQ (line 872) | fQ(a){return!1}
  method ez (line 873) | ez(a){return!0===a||!1===a}
  method kt (line 874) | kt(a){if(!0===a)return!0
  method kv (line 877) | kv(a){if(!0===a)return!0
  method ku (line 881) | ku(a){if(!0===a)return!0
  method kw (line 885) | kw(a){if(typeof a=="number")return a
  method ky (line 887) | ky(a){if(typeof a=="number")return a
  method kx (line 890) | kx(a){if(typeof a=="number")return a
  method fP (line 893) | fP(a){return typeof a=="number"&&Math.floor(a)===a}
  method fE (line 894) | fE(a){if(typeof a=="number"&&Math.floor(a)===a)return a
  method kz (line 896) | kz(a){if(typeof a=="number"&&Math.floor(a)===a)return a
  method fF (line 899) | fF(a){if(typeof a=="number"&&Math.floor(a)===a)return a
  method jf (line 902) | jf(a){return typeof a=="number"}
  method kA (line 903) | kA(a){if(typeof a=="number")return a
  method kC (line 905) | kC(a){if(typeof a=="number")return a
  method kB (line 908) | kB(a){if(typeof a=="number")return a
  method ji (line 911) | ji(a){return typeof a=="string"}
  method fG (line 912) | fG(a){if(typeof a=="string")return a
  method kD (line 914) | kD(a){if(typeof a=="string")return a
  method iT (line 917) | iT(a){if(typeof a=="string")return a
  method fU (line 920) | fU(a,b){var s,r,q
  method jp (line 923) | jp(a,b){var s,r,q,p,o,n,m=a.x,l=a.y
  method fN (line 932) | fN(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2=", "
  method C (line 961) | C(a,b){var s,r,q,p,o,n,m=a.w
  method jx (line 979) | jx(a){var s=v.mangledGlobalNames[a]
  method iz (line 982) | iz(a,b){var s=a.tR[b]
  method iy (line 985) | iy(a,b){var s,r,q,p,o,n=a.eT,m=n[b]
  method ix (line 994) | ix(a,b){return A.fC(a.tR,b)}
  method iw (line 995) | iw(a,b){return A.fC(a.eT,b)}
  method ck (line 996) | ck(a,b,c){var s,r=a.eC,q=r.get(b)
  method bl (line 1001) | bl(a,b,c){var s,r,q=b.z
  method ft (line 1008) | ft(a,b,c){var s,r,q,p=b.Q
  method U (line 1016) | U(a,b){b.a=A.j7
  method bk (line 1019) | bk(a,b,c){var s,r,q=a.eC.get(c)
  method fs (line 1027) | fs(a,b,c){var s,r=b.as+"*",q=a.eC.get(r)
  method iu (line 1032) | iu(a,b,c,d){var s,r,q
  method er (line 1041) | er(a,b,c){var s,r=b.as+"?",q=a.eC.get(r)
  method it (line 1046) | it(a,b,c,d){var s,r,q,p
  method fq (line 1061) | fq(a,b,c){var s,r=b.as+"/",q=a.eC.get(r)
  method ir (line 1066) | ir(a,b,c,d){var s,r
  method iv (line 1075) | iv(a,b){var s,r,q=""+b+"^",p=a.eC.get(q)
  method bi (line 1084) | bi(a){var s,r,q,p=a.length
  method iq (line 1087) | iq(a){var s,r,q,p,o,n=a.length
  method bj (line 1091) | bj(a,b,c){var s,r,q,p=b
  method ep (line 1104) | ep(a,b,c){var s,r,q,p,o,n
  method fr (line 1118) | fr(a,b,c){var s,r,q="+"+(b+"("+A.bi(c)+")"),p=a.eC.get(q)
  method fp (line 1128) | fp(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h...
  method eq (line 1142) | eq(a,b,c,d){var s,r=b.as+("<"+A.bi(c)+">"),q=a.eC.get(r)
  method is (line 1147) | is(a,b,c,d,e){var s,r,q,p,o,n,m,l
  method fl (line 1159) | fl(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}
  method fn (line 1160) | fn(a){var s,r,q,p,o,n,m,l=a.r,k=a.s
  method ii (line 1230) | ii(a,b,c,d){var s,r,q=b-48
  method fm (line 1235) | fm(a,b,c,d,e){var s,r,q,p,o,n,m=b+1
  method ik (line 1248) | ik(a,b){var s,r=a.u,q=A.fk(a,b),p=b.pop()
  method ih (line 1255) | ih(a,b){var s,r,q,p,o,n=null,m=a.u,l=b.pop()
  method ij (line 1282) | ij(a,b){var s=b.pop()
  method fk (line 1286) | fk(a,b){var s=b.splice(a.p)
  method a9 (line 1290) | a9(a,b,c){if(typeof c=="string")return A.bj(a,c,a.sEA)
  method fo (line 1293) | fo(a,b,c){var s,r=c.length
  method im (line 1295) | im(a,b,c){var s,r=c.length
  method il (line 1297) | il(a,b,c){var s,r,q=b.w
  method jU (line 1309) | jU(a,b,c){var s,r=b.d
  method q (line 1316) | q(a,b,c,d,e,f){var s,r,q,p,o,n,m,l,k,j,i
  method fO (line 1359) | fO(a3,a4,a5,a6,a7,a8){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2
  method jd (line 1394) | jd(a,b,c,d,e,f){var s,r,q,p,o,n=b.x,m=d.x
  method fD (line 1404) | fD(a,b,c,d,e,f,g){var s,r=b.length
  method jh (line 1407) | jh(a,b,c,d,e,f){var s,r=b.y,q=d.y,p=r.length
  method bu (line 1412) | bu(a){var s,r=a.w
  method jT (line 1419) | jT(a){var s
  method Y (line 1423) | Y(a){var s=a.w
  method fC (line 1425) | fC(a,b){var s,r,q=Object.keys(b),p=q.length
  method dI (line 1428) | dI(a){return a>0?new Array(a):v.typeUniverse.sEA}
  method ib (line 1439) | ib(){var s,r,q={}
  method ic (line 1447) | ic(a){self.scheduleImmediate(A.aF(new A.d6(a),0))}
  method id (line 1448) | id(a){self.setImmediate(A.aF(new A.d7(a),0))}
  method ie (line 1449) | ie(a){A.io(0,a)}
  method io (line 1450) | io(a,b){var s=new A.dy()
  method fS (line 1453) | fS(a){return new A.c5(new A.v($.r,a.i("v<0>")),a.i("c5<0>"))}
  method fK (line 1454) | fK(a,b){a.$2(0,null)
  method fH (line 1457) | fH(a,b){A.iV(a,b)}
  method fJ (line 1458) | fJ(a,b){b.ae(a)}
  method fI (line 1459) | fI(a,b){b.af(A.ae(a),A.ac(a))}
  method iV (line 1460) | iV(a,b){var s,r,q=new A.dK(b),p=new A.dL(b)
  method fZ (line 1468) | fZ(a){var s=function(b,c){return function(d,e){while(true){try{b(d,e)
  method cp (line 1472) | cp(a,b){var s=A.cn(a,"error",t.K)
  method eN (line 1474) | eN(a){var s
  method fj (line 1477) | fj(a,b){var s,r
  method ig (line 1487) | ig(a,b){var s,r,q={},p=q.a=a
  method ba (line 1496) | ba(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g={},f=g.a=a
  method jq (line 1545) | jq(a,b){if(t.C.b(a))return b.b1(a)
  method jn (line 1548) | jn(){var s,r
  method ju (line 1554) | ju(){$.eA=!0
  method fW (line 1558) | fW(a){var s=new A.c6(a),r=$.br
  method jt (line 1561) | jt(a){var s,r,q,p=$.aB
  method k0 (line 1571) | k0(a){var s=null,r=$.r
  method kb (line 1574) | kb(a){A.cn(a,"stream",t.K)
  method eB (line 1576) | eB(a,b){A.jt(new A.dW(a,b))}
  method fT (line 1577) | fT(a,b,c,d){var s,r=$.r
  method js (line 1583) | js(a,b,c,d,e){var s,r=$.r
  method jr (line 1589) | jr(a,b,c,d,e,f){var s,r=$.r
  method aC (line 1595) | aC(a,b,c,d){if(B.d!==c)d=c.aJ(d)
  method f_ (line 1662) | f_(a,b,c){return A.jI(a,new A.N(b.i("@<0>").A(c).i("N<1,2>")))}
  method ej (line 1663) | ej(a,b){return new A.N(a.i("@<0>").A(b).i("N<1,2>"))}
  method ek (line 1664) | ek(a){var s,r={}
  method jo (line 1682) | jo(a,b){var s,r,q,p=null
  method dM (line 1687) | dM(a){var s
  method iQ (line 1693) | iQ(a,b,c){var s,r,q,p,o=c-b
  method iP (line 1699) | iP(a,b,c,d){var s=a?$.ho():$.hn()
  method fB (line 1703) | fB(a,b){var s,r
  method eO (line 1706) | eO(a,b,c,d,e,f){if(B.c.a1(f,4)!==0)throw A.a(A.z("Invalid base64 padding...
  method iR (line 1709) | iR(a){switch(a){case 65:return"Missing extension byte"
  method e8 (line 1740) | e8(a,b){var s=A.f3(a,b)
  method hH (line 1743) | hH(a,b){a=A.a(a)
  method f0 (line 1747) | f0(a,b,c,d){var s,r=c?J.hR(a,d):J.hQ(a,d)
  method hV (line 1750) | hV(a,b,c){var s,r=A.h([],c.i("o<0>"))
  method bL (line 1754) | bL(a,b,c){var s=A.hU(a,c)
  method hU (line 1756) | hU(a,b){var s,r
  method fc (line 1761) | fc(a,b,c){var s,r
  method i6 (line 1767) | i6(a,b,c){var s=a.length
  method f6 (line 1770) | f6(a,b){return new A.cE(a,A.eZ(a,!1,b,!1,!1,!1))}
  method fb (line 1771) | fb(a,b,c){var s=J.L(b)
  method f1 (line 1776) | f1(a,b){return new A.bV(a,b.gbN(),b.gbQ(),b.gbO())}
  method fA (line 1777) | fA(a,b,c,d){var s,r,q,p,o,n="0123456789ABCDEF"
  method iH (line 1785) | iH(a){var s,r,q
  method f9 (line 1793) | f9(){return A.ac(new Error())}
  method at (line 1794) | at(a){if(typeof a=="number"||A.ez(a)||a==null)return J.aq(a)
  method hI (line 1797) | hI(a,b){A.cn(a,"error",t.K)
  method by (line 1800) | by(a){return new A.bx(a)}
  method a_ (line 1801) | a_(a,b){return new A.G(!1,null,b,a)}
  method eM (line 1802) | eM(a,b,c){return new A.G(!0,a,b,c)}
  method i4 (line 1803) | i4(a,b){return new A.b2(null,null,!0,a,b,"Value not in range")}
  method H (line 1804) | H(a,b,c,d,e){return new A.b2(b,c,!0,a,d,"Invalid value")}
  method b3 (line 1805) | b3(a,b,c){if(0>a||a>c)throw A.a(A.H(a,0,c,"start",null))
  method f5 (line 1808) | f5(a,b){if(a<0)throw A.a(A.H(a,0,null,b,null))
  method eU (line 1810) | eU(a,b,c,d){return new A.bF(b,!0,a,d,"Index out of range")}
  method T (line 1811) | T(a){return new A.c2(a)}
  method fe (line 1812) | fe(a){return new A.c_(a)}
  method fa (line 1813) | fa(a){return new A.b5(a)}
  method as (line 1814) | as(a){return new A.bD(a)}
  method z (line 1815) | z(a,b,c){return new A.cw(a,b,c)}
  method hP (line 1816) | hP(a,b,c){var s,r
  method eW (line 1822) | eW(a,b,c){var s,r
  method jl (line 1830) | jl(a,b){var s,r,q,p,o,n,m,l=a.gB(a),k=0,j=0
  method hZ (line 1855) | hZ(a,b,c,d){var s
  method c4 (line 1867) | c4(a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3=null,a4=a5....
  method fh (line 1939) | fh(a){var s=t.N
  method ia (line 1941) | ia(a,b,c){var s,r,q,p,o,n,m="IPv4 address should contain exactly 4 parts...
  method fg (line 1954) | fg(a,b,a0){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=null,d=new A.cY(a),c=new A....
  method es (line 1978) | es(a,b,c,d,e,f,g){return new A.bn(a,b,c,d,e,f,g)}
  method fu (line 1979) | fu(a){if(a==="http")return 80
  method aA (line 1982) | aA(a,b,c){throw A.a(A.z(c,a,b))}
  method iG (line 1983) | iG(a,b){if(a!=null&&a===A.fu(b))return null
  method iE (line 1985) | iE(a,b,c,d){var s,r,q,p,o,n
  method iB (line 2000) | iB(a,b,c){var s=B.a.Z(a,"%",b)
  method fz (line 2002) | fz(a,b,c,d){var s,r,q,p,o,n,m,l,k,j,i=d!==""?new A.y(d):null
  method iM (line 2030) | iM(a,b,c){var s,r,q,p,o,n,m,l,k,j,i
  method iJ (line 2064) | iJ(a,b,c){var s,r,q
  method iA (line 2071) | iA(a){if(a==="http")return"http"
  method iK (line 2076) | iK(a,b,c){return A.bo(a,b,c,B.a8,!1,!1)}
  method iF (line 2077) | iF(a,b,c,d,e,f){var s,r=e==="file",q=r||f
  method iL (line 2082) | iL(a,b,c){var s=b.length===0
  method eu (line 2085) | eu(a,b,c,d){if(a!=null){if(d!=null)throw A.a(A.a_("Both query and queryP...
  method iI (line 2088) | iI(a){var s={},r=new A.y("")
  method iD (line 2093) | iD(a,b,c){return A.bo(a,b,c,B.f,!0,!1)}
  method ev (line 2094) | ev(a,b,c){var s,r,q,p,o,n=b+2
  method et (line 2105) | et(a){var s,r,q,p,o,n="0123456789ABCDEF"
  method bo (line 2118) | bo(a,b,c,d,e,f){var s=A.fy(a,b,c,d,e,f)
  method fy (line 2120) | fy(a,b,c,d,e,f){var s,r,q,p,o,n,m,l,k,j,i=null
  method fx (line 2142) | fx(a){if(B.a.u(a,"."))return!0
  method iO (line 2144) | iO(a){var s,r,q,p,o,n
  method iN (line 2152) | iN(a,b){var s,r,q,p,o,n
  method fv (line 2166) | fv(a){var s,r,q=a.length
  method iC (line 2170) | iC(a,b){var s,r,q
  method ew (line 2176) | ew(a,b,c,d,e){var s,r,q,p,o=b
  method fw (line 2192) | fw(a){var s=a|32
  method ff (line 2194) | ff(a,b,c){var s,r,q,p,o,n,m,l,k="Invalid MIME type",j=A.h([b-1],t.t)
  method j_ (line 2209) | j_(){var s,r,q,p,o,n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn...
  method fV (line 2347) | fV(a,b,c,d,e){var s,r,q,p,o=$.hq()
  method iY (line 2440) | iY(a){var s,r=a.$dart_jsFunction
  method iW (line 2446) | iW(a,b){return A.i1(a,b,null)}
  method ab (line 2447) | ab(a){if(typeof a=="function")return a
  method eb (line 2449) | eb(a,b){var s=new A.v($.r,b.i("v<0>")),r=new A.b7(s,b.i("b7<0>"))
  method hL (line 2457) | hL(a){var s,r,q,p,o,n,m,l,k="enclosedBy"
  method jN (line 2488) | jN(){var s=self,r=s.document.getElementById("search-box"),q=s.document.g...
  method eo (line 2490) | eo(a){var s=A.h([],t.O),r=A.h([],t.M)
  method iZ (line 2492) | iZ(a,b){var s,r,q,p,o,n,m,l,k=self,j=k.document.createElement("div"),i=b.e
  method jm (line 2529) | jm(a,b){var s,r=a.innerHTML
  method ex (line 2535) | ex(a,b){return A.k3(a,A.f6(b,!1),new A.dS(),null)}
  method j6 (line 2566) | j6(){var s=self,r=s.document.getElementById("sidenav-left-toggle"),q=s.d...
  method j5 (line 2569) | j5(){var s,r,q,p,o=self,n=o.document.body
  method fR (line 2580) | fR(a,b,c){if(b==null||b.length===0||c==null)return
  method fY (line 2582) | fY(a,b){var s,r,q,p
  method jO (line 2591) | jO(){var s,r,q,p=self,o=p.document.body
  method jZ (line 2603) | jZ(a){if(typeof dartPrint=="function"){dartPrint(a)
  method k4 (line 2607) | k4(a){A.h8(new A.aV("Field '"+a+"' has been assigned during initializati...
  method bv (line 2608) | bv(){A.h8(new A.aV("Field '' has been assigned during initialization."),...
  method jW (line 2609) | jW(){A.j5()
  method F (line 2619) | F(a,b){return a===b}
  method gn (line 2620) | gn(a){return A.bY(a)}
  method h (line 2621) | h(a){return"Instance of '"+A.cQ(a)+"'"}
  method b_ (line 2622) | b_(a,b){throw A.a(A.f1(a,b))}
  method gt (line 2623) | gt(a){return A.an(A.ey(this))}
  method h (line 2625) | h(a){return String(a)}
  method gn (line 2626) | gn(a){return a?519018:218159}
  method gt (line 2627) | gt(a){return A.an(t.y)}
  method F (line 2630) | F(a,b){return null==b}
  method h (line 2631) | h(a){return"null"}
  method gn (line 2632) | gn(a){return 0}
  method gn (line 2637) | gn(a){return 0}
  method h (line 2638) | h(a){return String(a)}
  method h (line 2642) | h(a){var s=a[$.eK()]
  method gn (line 2646) | gn(a){return 0}
  method h (line 2647) | h(a){return String(a)}
  method gn (line 2649) | gn(a){return 0}
  method h (line 2650) | h(a){return String(a)}
  method X (line 2652) | X(a,b){return new A.M(a,A.am(a).i("@<1>").A(b).i("M<1,2>"))}
  method ad (line 2653) | ad(a,b){if(!!a.fixed$length)A.aH(A.T("add"))
  method aI (line 2655) | aI(a,b){var s
  method bg (line 2659) | bg(a,b){var s,r=b.length
  method Y (line 2663) | Y(a){if(!!a.fixed$length)A.aH(A.T("clear"))
  method aY (line 2665) | aY(a,b){var s,r=A.f0(a.length,"",!1,t.N)
  method bG (line 2668) | bG(a,b,c){var s,r,q=a.length
  method bH (line 2671) | bH(a,b,c){return this.bG(a,b,c,t.z)}
  method E (line 2672) | E(a,b){return a[b]}
  method bd (line 2673) | bd(a,b,c){var s=a.length
  method gbF (line 2678) | gbF(a){if(a.length>0)return a[0]
  method ga_ (line 2680) | ga_(a){var s=a.length
  method bc (line 2683) | bc(a,b){var s,r,q,p,o
  method bt (line 2694) | bt(a,b){var s,r=a.length
  method h (line 2697) | h(a){return A.eW(a,"[","]")}
  method gB (line 2698) | gB(a){return new J.ar(a,a.length,A.am(a).i("ar<1>"))}
  method gn (line 2699) | gn(a){return A.bY(a)}
  method gl (line 2700) | gl(a){return a.length}
  method k (line 2701) | k(a,b){if(!(b>=0&&b<a.length))throw A.a(A.eF(a,b))
  method q (line 2703) | q(a,b,c){if(!!a.immutable$list)A.aH(A.T("indexed set"))
  method gp (line 2710) | gp(){var s=this.d
  method m (line 2712) | m(){var s,r=this,q=r.a,p=q.length
  method aL (line 2720) | aL(a,b){var s
  method gam (line 2728) | gam(a){return a===0?1/a<0:a<0}
  method h (line 2729) | h(a){if(a===0&&1/a<0)return"-0.0"
  method gn (line 2731) | gn(a){var s,r,q,p,o=a|0
  method a1 (line 2738) | a1(a,b){var s=a%b
  method bw (line 2742) | bw(a,b){return(a|0)===a?a/b|0:this.bx(a,b)}
  method bx (line 2743) | bx(a,b){var s=a/b
  method V (line 2747) | V(a,b){var s
  method bv (line 2751) | bv(a,b){if(0>b)throw A.a(A.jz(b))
  method aF (line 2753) | aF(a,b){return b>31?0:a>>>b}
  method gt (line 2754) | gt(a){return A.an(t.H)}
  method gt (line 2757) | gt(a){return A.an(t.S)}
  method gt (line 2761) | gt(a){return A.an(t.i)}
  method b6 (line 2764) | b6(a,b){return a+b}
  method J (line 2765) | J(a,b,c,d){var s=A.b3(b,c,a.length)
  method v (line 2767) | v(a,b,c){var s
  method u (line 2772) | u(a,b){return this.v(a,b,0)}
  method j (line 2773) | j(a,b,c){return a.substring(b,A.b3(b,c,a.length))}
  method K (line 2774) | K(a,b){return this.j(a,b,null)}
  method b9 (line 2775) | b9(a,b){var s,r
  method Z (line 2783) | Z(a,b,c){var s
  method aU (line 2787) | aU(a,b){return this.Z(a,b,0)}
  method ag (line 2788) | ag(a,b){return A.k2(a,b,0)}
  method aL (line 2789) | aL(a,b){var s
  method h (line 2793) | h(a){return a}
  method gn (line 2794) | gn(a){var s,r,q
  method gt (line 2800) | gt(a){return A.an(t.N)}
  method gl (line 2801) | gl(a){return a.length}
  method gB (line 2805) | gB(a){var s=A.E(this)
  method gl (line 2807) | gl(a){return J.aI(this.gN())}
  method E (line 2808) | E(a,b){return A.E(this).y[1].a(J.ef(this.gN(),b))}
  method h (line 2809) | h(a){return J.aq(this.gN())}
  method m (line 2811) | m(){return this.a.m()}
  method gp (line 2812) | gp(){return this.$ti.y[1].a(this.a.gp())}
  method gN (line 2814) | gN(){return this.a}
  method k (line 2817) | k(a,b){return this.$ti.y[1].a(J.hr(this.a,b))}
  method q (line 2818) | q(a,b,c){J.hs(this.a,b,this.$ti.c.a(c))}
  method X (line 2822) | X(a,b){return new A.M(this.a,this.$ti.i("@<1>").A(b).i("M<1,2>"))}
  method gN (line 2823) | gN(){return this.a}
  method h (line 2825) | h(a){return"LateInitializationError: "+this.a}
  method gl (line 2827) | gl(a){return this.a.length}
  method k (line 2828) | k(a,b){return this.a.charCodeAt(b)}
  method gB (line 2832) | gB(a){var s=this
  method gp (line 2835) | gp(){var s=this.d
  method m (line 2837) | m(){var s,r=this,q=r.a,p=J.ao(q),o=p.gl(q)
  method gB (line 2844) | gB(a){var s=A.E(this)
  method gl (line 2846) | gl(a){return J.aI(this.a)}
  method E (line 2847) | E(a,b){return this.b.$1(J.ef(this.a,b))}
  method m (line 2850) | m(){var s=this,r=s.b
  method gp (line 2854) | gp(){var s=this.a
  method gl (line 2857) | gl(a){return J.aI(this.a)}
  method E (line 2858) | E(a,b){return this.b.$1(J.ef(this.a,b))}
  method q (line 2861) | q(a,b,c){throw A.a(A.T("Cannot modify an unmodifiable list"))}
  method gn (line 2864) | gn(a){var s=this._hashCode
  method h (line 2869) | h(a){return'Symbol("'+this.a+'")'}
  method F (line 2870) | F(a,b){if(b==null)return!1
  method h (line 2877) | h(a){return A.ek(this)}
  method q (line 2878) | q(a,b,c){A.hG()}
  method gl (line 2881) | gl(a){return this.b.length}
  method gbq (line 2882) | gbq(){var s=this.$keys
  method H (line 2885) | H(a){if("__proto__"===a)return!1
  method k (line 2887) | k(a,b){if(!this.H(b))return null
  method C (line 2889) | C(a,b){var s,r,q=this.gbq(),p=this.b
  method gbN (line 2892) | gbN(){var s=this.a
  method gbQ (line 2895) | gbQ(){var s,r,q,p,o,n=this
  method gbO (line 2904) | gbO(){var s,r,q,p,o,n,m,l,k=this
  method $2 (line 2917) | $2(a,b){var s=this.a
  method D (line 2923) | D(a){var s,r,q=this,p=new RegExp(q.a).exec(a)
  method h (line 2938) | h(a){return"Null check operator used on a null value"}
  method h (line 2940) | h(a){var s,r=this,q="NoSuchMethodError: method not found: '",p=r.b
  method h (line 2946) | h(a){var s=this.a
  method h (line 2949) | h(a){return"Throw of null ('"+(this.a===null?"null":"undefined")+"' from...
  method h (line 2952) | h(a){var s,r=this.b
  method h (line 2959) | h(a){var s=this.constructor,r=s==null?null:s.name
  method gbZ (line 2961) | gbZ(){return this}
  method h (line 2969) | h(a){var s=this.$static_name
  method F (line 2973) | F(a,b){if(b==null)return!1
  method gn (line 2977) | gn(a){return(A.h5(this.a)^A.bY(this.$_target))>>>0}
  method h (line 2978) | h(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.cQ(this.a)...
  method h (line 2980) | h(a){return"Reading static variable '"+this.a+"' during its initializati...
  method h (line 2982) | h(a){return"RuntimeError: "+this.a}
  method gl (line 2985) | gl(a){return this.a}
  method gO (line 2986) | gO(){return new A.O(this,A.E(this).i("O<1>"))}
  method gb5 (line 2987) | gb5(){var s=A.E(this)
  method H (line 2989) | H(a){var s=this.b
  method k (line 2992) | k(a,b){var s,r,q,p,o=null
  method bL (line 3002) | bL(a){var s,r,q=this.d
  method q (line 3008) | q(a,b,c){var s,r,q,p,o,n,m=this
  method Y (line 3019) | Y(a){var s=this
  method C (line 3023) | C(a,b){var s=this,r=s.e,q=s.r
  method av (line 3027) | av(a,b,c){var s=a[b]
  method aC (line 3030) | aC(){this.r=this.r+1&1073741823}
  method a9 (line 3031) | a9(a,b){var s=this,r=new A.cJ(a,b)
  method aV (line 3036) | aV(a){return J.Z(a)&1073741823}
  method aW (line 3037) | aW(a,b){var s,r
  method h (line 3042) | h(a){return A.ek(this)}
  method a8 (line 3043) | a8(){var s=Object.create(null)
  method $1 (line 3048) | $1(a){var s=this.a,r=s.k(0,a)
  method $S (line 3050) | $S(){return A.E(this.a).i("2(1)")}
  method gl (line 3053) | gl(a){return this.a.a}
  method gB (line 3054) | gB(a){var s=this.a,r=new A.bK(s,s.r)
  method gp (line 3058) | gp(){return this.d}
  method m (line 3059) | m(){var s,r=this,q=r.a
  method $1 (line 3067) | $1(a){return this.a(a)}
  method $2 (line 3070) | $2(a,b){return this.a(a,b)}
  method $1 (line 3073) | $1(a){return this.a(a)}
  method h (line 3076) | h(a){return this.aH(!1)}
  method aH (line 3077) | aH(a){var s,r,q,p,o,n=this.bo(),m=this.aB(),l=(a?""+"Record ":"")+"("
  method bo (line 3084) | bo(){var s,r=this.$s
  method bj (line 3089) | bj(){var s,r,q,p=this.$r,o=p.indexOf("("),n=p.substring(1,o),m=p.substri...
  method aB (line 3096) | aB(){return[this.a,this.b]}
  method F (line 3097) | F(a,b){if(b==null)return!1
  method gn (line 3099) | gn(a){return A.hZ(this.$s,this.a,this.b,B.i)}
  method h (line 3101) | h(a){return"RegExp/"+this.a+"/"+this.b.flags}
  method gbr (line 3102) | gbr(){var s=this,r=s.c
  method bn (line 3106) | bn(a,b){var s,r=this.gbr()
  method gbD (line 3112) | gbD(){var s=this.b
  method k (line 3114) | k(a,b){return this.b[b]}
  method gp (line 3118) | gp(){var s=this.d
  method m (line 3120) | m(){var s,r,q,p,o,n=this,m=n.b
  method gt (line 3137) | gt(a){return B.ad}
  method gt (line 3141) | gt(a){return B.ae}
  method gl (line 3144) | gl(a){return a.length}
  method k (line 3147) | k(a,b){A.V(b,a,a.length)
  method q (line 3149) | q(a,b,c){A.V(b,a,a.length)
  method q (line 3154) | q(a,b,c){A.V(b,a,a.length)
  method gt (line 3159) | gt(a){return B.af}
  method gt (line 3162) | gt(a){return B.ag}
  method gt (line 3165) | gt(a){return B.ah}
  method k (line 3166) | k(a,b){A.V(b,a,a.length)
  method gt (line 3170) | gt(a){return B.ai}
  method k (line 3171) | k(a,b){A.V(b,a,a.length)
  method gt (line 3175) | gt(a){return B.aj}
  method k (line 3176) | k(a,b){A.V(b,a,a.length)
  method gt (line 3180) | gt(a){return B.al}
  method k (line 3181) | k(a,b){A.V(b,a,a.length)
  method gt (line 3185) | gt(a){return B.am}
  method k (line 3186) | k(a,b){A.V(b,a,a.length)
  method gt (line 3190) | gt(a){return B.an}
  method gl (line 3191) | gl(a){return a.length}
  method k (line 3192) | k(a,b){A.V(b,a,a.length)
  method gt (line 3196) | gt(a){return B.ao}
  method gl (line 3197) | gl(a){return a.length}
  method k (line 3198) | k(a,b){A.V(b,a,a.length)
  method i (line 3207) | i(a){return A.bl(v.typeUniverse,this,a)}
  method A (line 3208) | A(a){return A.ft(v.typeUniverse,this,a)}
  method h (line 3211) | h(a){return A.C(this.a,null)}
  method h (line 3213) | h(a){return this.a}
  method $1 (line 3216) | $1(a){var s=this.a,r=s.a
  method $1 (line 3221) | $1(a){var s,r
  method $0 (line 3228) | $0(){this.a.$0()}
  method $0 (line 3231) | $0(){this.a.$0()}
  method bf (line 3234) | bf(a,b){if(self.setTimeout!=null)self.setTimeout(A.aF(new A.dz(this,b),0...
  method $0 (line 3237) | $0(){this.b.$0()}
  method ae (line 3240) | ae(a){var s,r=this
  method af (line 3246) | af(a,b){var s=this.a
  method $1 (line 3250) | $1(a){return this.a.$2(0,a)}
  method $2 (line 3253) | $2(a,b){this.a.$2(1,new A.aN(a,b))}
  method $2 (line 3256) | $2(a,b){this.a(a,b)}
  method h (line 3259) | h(a){return A.i(this.a)}
  method gR (line 3261) | gR(){return this.b}
  method af (line 3263) | af(a,b){var s
  method aM (line 3269) | aM(a){return this.af(a,null)}
  method ae (line 3271) | ae(a){var s=this.a
  method bM (line 3275) | bM(a){if((this.c&15)!==6)return!0
  method bI (line 3277) | bI(a){var s,r=this.e,q=null,p=a.a,o=this.b.b
  method aE (line 3284) | aE(a){this.a=this.a&1|4
  method au (line 3286) | au(a,b,c){var s,r,q=$.r
  method ar (line 3292) | ar(a,b){return this.au(a,null,b)}
  method aG (line 3293) | aG(a,b,c){var s=new A.v($.r,c.i("v<0>"))
  method bu (line 3296) | bu(a){this.a=this.a&1|16
  method T (line 3298) | T(a){this.a=a.a&30|this.a&1
  method a3 (line 3300) | a3(a){var s=this,r=s.a
  method aa (line 3305) | aa(a){var s,r,q,p,o,n=this,m={}
  method ab (line 3317) | ab(){var s=this.c
  method U (line 3320) | U(a){var s,r,q
  method bi (line 3323) | bi(a){var s,r,q,p=this
  method a4 (line 3328) | a4(a){var s=this,r=s.ab()
  method L (line 3332) | L(a,b){var s=this.ab()
  method aw (line 3335) | aw(a){if(this.$ti.i("a0<1>").b(a)){this.az(a)
  method bh (line 3337) | bh(a){this.a^=2
  method az (line 3339) | az(a){if(this.$ti.b(a)){A.ig(a,this)
  method S (line 3341) | S(a,b){this.a^=2
  method $0 (line 3345) | $0(){A.ba(this.a,this.b)}
  method $0 (line 3348) | $0(){A.ba(this.b,this.a.a)}
  method $1 (line 3351) | $1(a){var s,r,q,p=this.a
  method $2 (line 3358) | $2(a,b){this.a.L(a,b)}
  method $0 (line 3361) | $0(){this.a.L(this.b,this.c)}
  method $0 (line 3364) | $0(){A.fj(this.a.a,this.b)}
  method $0 (line 3367) | $0(){this.a.a4(this.b)}
  method $0 (line 3370) | $0(){this.a.L(this.b,this.c)}
  method $0 (line 3373) | $0(){var s,r,q,p,o,n,m=this,l=null
  method $1 (line 3390) | $1(a){return this.a}
  method $0 (line 3393) | $0(){var s,r,q,p,o
  method $0 (line 3403) | $0(){var s,r,q,p,o,n,m=this
  method $0 (line 3419) | $0(){A.hI(this.a,this.b)}
  method bW (line 3422) | bW(a){var s,r,q
  method aJ (line 3427) | aJ(a){return new A.dr(this,a)}
  method bT (line 3428) | bT(a){if($.r===B.d)return a.$0()
  method bS (line 3430) | bS(a){return this.bT(a,t.z)}
  method bX (line 3431) | bX(a,b){if($.r===B.d)return a.$1(b)
  method aq (line 3433) | aq(a,b){var s=t.z
  method bV (line 3435) | bV(a,b,c){if($.r===B.d)return a.$2(b,c)
  method bU (line 3437) | bU(a,b,c){var s=t.z
  method bR (line 3439) | bR(a){return a}
  method b1 (line 3440) | b1(a){var s=t.z
  method $0 (line 3443) | $0(){return this.a.bW(this.b)}
  method gB (line 3446) | gB(a){return new A.au(a,this.gl(a),A.aG(a).i("au<e.E>"))}
  method E (line 3447) | E(a,b){return this.k(a,b)}
  method X (line 3448) | X(a,b){return new A.M(a,A.aG(a).i("@<e.E>").A(b).i("M<1,2>"))}
  method bE (line 3449) | bE(a,b,c,d){var s
  method h (line 3452) | h(a){return A.eW(a,"[","]")}
  method C (line 3456) | C(a,b){var s,r,q,p
  method gl (line 3460) | gl(a){var s=this.gO()
  method h (line 3462) | h(a){return A.ek(this)}
  method $2 (line 3465) | $2(a,b){var s,r=this.a
  method q (line 3476) | q(a,b,c){throw A.a(A.T("Cannot modify unmodifiable map"))}
  method k (line 3478) | k(a,b){return this.a.k(0,b)}
  method q (line 3479) | q(a,b,c){this.a.q(0,b,c)}
  method C (line 3480) | C(a,b){this.a.C(0,b)}
  method gl (line 3481) | gl(a){var s=this.a
  method h (line 3483) | h(a){return this.a.h(0)}
  method k (line 3488) | k(a,b){var s,r=this.b
  method gl (line 3493) | gl(a){return this.b==null?this.c.a:this.M().length}
  method gO (line 3494) | gO(){if(this.b==null){var s=this.c
  method q (line 3496) | q(a,b,c){var s,r,q=this
  method H (line 3502) | H(a){if(this.b==null)return this.c.H(a)
  method C (line 3504) | C(a,b){var s,r,q,p,o=this
  method M (line 3512) | M(){var s=this.c
  method by (line 3515) | by(){var s,r,q,p,o,n=this
  method bs (line 3524) | bs(a){var s
  method gl (line 3529) | gl(a){return this.a.gl(0)}
  method E (line 3530) | E(a,b){var s=this.a
  method gB (line 3532) | gB(a){var s=this.a
  method $0 (line 3537) | $0(){var s,r
  method $0 (line 3542) | $0(){var s,r
  method bP (line 3547) | bP(a0,a1,a2){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a="Invalid base64 e...
  method h (line 3589) | h(a){return"unknown"}
  method I (line 3591) | I(a){var s=this.bl(a,0,a.length)
  method bl (line 3593) | bl(a,b,c){var s,r,q,p
  method bA (line 3614) | bA(a,b){var s=A.jo(a,this.gbC().a)
  method gbC (line 3616) | gbC(){return B.L}
  method I (line 3620) | I(a){var s,r,q,p=A.b3(0,null,a.length)
  method ac (line 3628) | ac(){var s=this,r=s.c,q=s.b,p=s.b=q+1
  method bz (line 3634) | bz(a,b){var s,r,q,p,o=this
  method bp (line 3648) | bp(a,b,c){var s,r,q,p,o,n,m,l=this
  method I (line 3673) | I(a){return new A.dE(this.a).bm(a,0,null,!0)}
  method bm (line 3675) | bm(a,b,c,d){var s,r,q,p,o,n,m=this,l=A.b3(b,c,J.aI(a))
  method a5 (line 3690) | a5(a,b,c,d){var s,r,q=this
  method bB (line 3695) | bB(a,b,c,d){var s,r,q,p,o,n,m,l=this,k=65533,j=l.b,i=l.c,h=new A.y(""),g...
  method $2 (line 3733) | $2(a,b){var s=this.b,r=this.a,q=s.a+=r.a
  method $2 (line 3742) | $2(a,b){var s,r
  method h (line 3751) | h(a){return this.aA()}
  method gR (line 3753) | gR(){return A.i2(this)}
  method h (line 3755) | h(a){var s=this.a
  method ga7 (line 3760) | ga7(){return"Invalid argument"+(!this.a?"(s)":"")}
  method ga6 (line 3761) | ga6(){return""}
  method h (line 3762) | h(a){var s=this,r=s.c,q=r==null?"":" ("+r+")",p=s.d,o=p==null?"":": "+p,...
  method gal (line 3765) | gal(){return this.b}
  method gal (line 3767) | gal(){return this.b}
  method ga7 (line 3768) | ga7(){return"RangeError"}
  method ga6 (line 3769) | ga6(){var s,r=this.e,q=this.f
  method gal (line 3776) | gal(){return this.b}
  method ga7 (line 3777) | ga7(){return"RangeError"}
  method ga6 (line 3778) | ga6(){if(this.b<0)return": index must not be negative"
  method gl (line 3782) | gl(a){return this.f}
  method h (line 3784) | h(a){var s,r,q,p,o,n,m,l,k=this,j={},i=new A.y("")
  method h (line 3796) | h(a){return"Unsupported operation: "+this.a}
  method h (line 3798) | h(a){return"UnimplementedError: "+this.a}
  method h (line 3800) | h(a){return"Bad state: "+this.a}
  method h (line 3802) | h(a){var s=this.a
  method h (line 3806) | h(a){return"Out of Memory"}
  method gR (line 3807) | gR(){return null}
  method h (line 3810) | h(a){return"Stack Overflow"}
  method gR (line 3811) | gR(){return null}
  method h (line 3814) | h(a){return"Exception: "+this.a}
  method h (line 3816) | h(a){var s,r,q,p,o,n,m,l,k,j,i,h=this.a,g=""!==h?"FormatException: "+h:"...
  method X (line 3842) | X(a,b){return A.hA(this,A.E(this).i("n.E"),b)}
  method gl (line 3843) | gl(a){var s,r=this.gB(this)
  method E (line 3846) | E(a,b){var s,r
  method h (line 3850) | h(a){return A.hP(this,"(",")")}
  method gn (line 3852) | gn(a){return A.l.prototype.gn.call(this,0)}
  method h (line 3853) | h(a){return"null"}
  method F (line 3855) | F(a,b){return this===b}
  method gn (line 3856) | gn(a){return A.bY(this)}
  method h (line 3857) | h(a){return"Instance of '"+A.cQ(this)+"'"}
  method b_ (line 3858) | b_(a,b){throw A.a(A.f1(this,b))}
  method gt (line 3859) | gt(a){return A.jL(this)}
  method toString (line 3860) | toString(){return this.h(this)}
  method h (line 3862) | h(a){return""}
  method gl (line 3865) | gl(a){return this.a.length}
  method h (line 3866) | h(a){var s=this.a
  method $2 (line 3869) | $2(a,b){var s,r,q,p=B.a.aU(b,"=")
  method $2 (line 3876) | $2(a,b){throw A.a(A.z("Illegal IPv4 address, "+a,this.a,b))}
  method $2 (line 3879) | $2(a,b){throw A.a(A.z("Illegal IPv6 address, "+a,this.a,b))}
  method $2 (line 3882) | $2(a,b){var s
  method gW (line 3889) | gW(){var s,r,q,p,o=this,n=o.w
  method gn (line 3907) | gn(a){var s,r=this,q=r.y
  method gao (line 3912) | gao(){var s,r=this,q=r.z
  method gb4 (line 3917) | gb4(){return this.b}
  method gaj (line 3918) | gaj(){var s=this.c
  method ga0 (line 3922) | ga0(){var s=this.d
  method gan (line 3924) | gan(){var s=this.f
  method gaO (line 3926) | gaO(){var s=this.r
  method ap (line 3928) | ap(a){var s,r,q,p,o=this,n=o.a,m=n==="file",l=o.b,k=o.d,j=o.c
  method gaX (line 3937) | gaX(){if(this.a!==""){var s=this.r
  method gaQ (line 3940) | gaQ(){return this.c!=null}
  method gaT (line 3941) | gaT(){return this.f!=null}
  method gaR (line 3942) | gaR(){return this.r!=null}
  method h (line 3943) | h(a){return this.gW()}
  method F (line 3944) | F(a,b){var s,r,q=this
  method ga2 (line 3962) | ga2(){return this.a}
  method gb0 (line 3963) | gb0(){return this.e}
  method $2 (line 3965) | $2(a,b){var s=this.b,r=this.a
  method $2 (line 3975) | $2(a,b){var s,r
  method gb3 (line 3980) | gb3(){var s,r,q,p,o=this,n=null,m=o.c
  method h (line 3988) | h(a){var s=this.a
  method $2 (line 3991) | $2(a,b){var s=this.a[a]
  method $3 (line 3996) | $3(a,b,c){var s,r
  method $3 (line 4000) | $3(a,b,c){var s,r
  method gaQ (line 4004) | gaQ(){return this.c>0}
  method gaS (line 4005) | gaS(){return this.c>0&&this.d+1<this.e}
  method gaT (line 4006) | gaT(){return this.f<this.r}
  method gaR (line 4007) | gaR(){return this.r<this.a.length}
  method gaX (line 4008) | gaX(){return this.b>0&&this.r>=this.a.length}
  method ga2 (line 4009) | ga2(){var s=this.w
  method bk (line 4011) | bk(){var s,r=this,q=r.b
  method gb4 (line 4019) | gb4(){var s=this.c,r=this.b+3
  method gaj (line 4021) | gaj(){var s=this.c
  method ga0 (line 4023) | ga0(){var s,r=this
  method gb0 (line 4029) | gb0(){return B.a.j(this.a,this.e,this.f)}
  method gan (line 4030) | gan(){var s=this.f,r=this.r
  method gaO (line 4032) | gaO(){var s=this.r,r=this.a
  method gao (line 4034) | gao(){if(this.f>=this.r)return B.aa
  method ap (line 4036) | ap(a){var s,r,q,p,o,n=this,m=null,l=n.ga2(),k=l==="file",j=n.c,i=j>0?B.a...
  method gn (line 4049) | gn(a){var s=this.x
  method F (line 4051) | F(a,b){if(b==null)return!1
  method h (line 4054) | h(a){return this.a}
  method $1 (line 4058) | $1(a){return this.a.ae(a)}
  method $1 (line 4061) | $1(a){if(a==null)return this.a.aM(new A.cN(a===undefined))
  method h (line 4065) | h(a){return"Promise was rejected with a value of `"+(this.a?"undefined":...
  method aA (line 4067) | aA(){return"Kind."+this.b}
  method h (line 4068) | h(a){var s
  method aA (line 4117) | aA(){return"_MatchPosition."+this.b}
  method aN (line 4119) | aN(a){var s,r,q,p,o,n,m,l,k,j,i
  method $1 (line 4133) | $1(a){this.a.push(new A.cg(this.b,a))}
  method $2 (line 4136) | $2(a,b){var s,r,q=a.b.a-b.b.a
  method $1 (line 4149) | $1(a){return a.a}
  method gaD (line 4152) | gaD(){switch(this.d.a){case 3:var s=0
  method $0 (line 4201) | $0(){var s,r=self.document.body
  method $0 (line 4207) | $0(){A.jZ("Could not activate search functionality.")
  method $1 (line 4216) | $1(a){return this.b8(a)}
  method b8 (line 4217) | b8(a){var s=0,r=A.fS(t.P),q,p=this,o,n,m,l,k,j,i,h,g
  method gG (line 4245) | gG(){var s,r=this,q=r.c
  method gaZ (line 4256) | gaZ(){var s,r=this.d
  method gP (line 4262) | gP(){var s,r=this.e
  method ak (line 4268) | ak(a){var s,r,q,p=this
  method bb (line 4290) | bb(a){var s,r,q,p,o,n=self,m=n.document.getElementById("dartdoc-main-con...
  method ai (line 4314) | ai(){var s=this.gG()
  method b2 (line 4318) | b2(a,b,c){var s,r,q,p,o=this
  method bY (line 4335) | bY(a,b){return this.b2(a,b,!1)}
  method ah (line 4336) | ah(a,b,c){var s,r,q,p=this
  method bK (line 4346) | bK(a,b){return this.ah(a,!1,b)}
  method aP (line 4347) | aP(a){return this.ah(a,!1,!1)}
  method bJ (line 4348) | bJ(a,b){return this.ah(a,b,!1)}
  method aK (line 4349) | aK(a){var s,r=this
  method ba (line 4354) | ba(a){var s=this,r=t.g
  method $1 (line 4360) | $1(a){if(J.F(a.key,"/")&&!t.m.b(self.document.activeElement)){a.preventD...
  method $1 (line 4364) | $1(a){this.a.bJ(this.b.value,!0)}
  method $1 (line 4367) | $1(a){this.a.aK(this.b)}
  method $1 (line 4370) | $1(a){this.a.aP(this.b.value)}
  method $1 (line 4373) | $1(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=this
  method $1 (line 4411) | $1(a){a.preventDefault()}
  method $1 (line 4414) | $1(a){var s=this.a.e
  method $1 (line 4419) | $1(a){return"<strong class='tt-highlight'>"+A.i(a.k(0,0))+"</strong>"}
  method $1 (line 4422) | $1(a){var s=this.a
  method $1 (line 4428) | $1(a){return this.b7(a)}
  method b7 (line 4429) | b7(a){var s=0,r=A.fS(t.P),q,p=this,o,n,m
  method $0 (line 4447) | $0(){var s=this.a,r=this.b
  method $1 (line 4455) | $1(a){this.a.$0()}
  function getTag (line 4543) | function getTag(o) {
  function getUnknownTag (line 4547) | function getUnknownTag(object, tag) {
  function getUnknownTagGenericBrowser (line 4554) | function getUnknownTagGenericBrowser(object, tag) {
  function prototypeForTag (line 4558) | function prototypeForTag(tag) {
  function discriminator (line 4565) | function discriminator(tag) { return null; }
  function confirm (line 4580) | function confirm(p) {
  function getTagFirefox (line 4605) | function getTagFirefox(o) {
  function getTagIE (line 4625) | function getTagIE(o) {
  function prototypeForTagIE (line 4634) | function prototypeForTagIE(tag) {
  function getTagFixed (line 4645) | function getTagFixed(o) {
  function prototypeForTagFixed (line 4653) | function prototypeForTagFixed(tag) {
  function onLoad (line 4797) | function onLoad(b){for(var q=0;q<s.length;++q){s[q].removeEventListener(...

FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/highlight.pack.js
  function e (line 6) | function e(n){
  class n (line 12) | class n{constructor(e){
    method constructor (line 12) | constructor(e){
    method ignoreMatch (line 14) | ignoreMatch(){this.isMatchIgnored=!0}
  function t (line 14) | function t(e){
  function a (line 16) | function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n]
  class s (line 18) | class s{constructor(e,n){
    method constructor (line 18) | constructor(e,n){
    method addText (line 19) | addText(e){
    method openNode (line 20) | openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{
    method closeNode (line 25) | closeNode(e){i(e)&&(this.buffer+="</span>")}
    method value (line 25) | value(){return this.buffer}
    method span (line 25) | span(e){
  class o (line 27) | class o{constructor(){
    method constructor (line 27) | constructor(){
    method top (line 28) | get top(){
    method root (line 29) | get root(){return this.rootNode}
    method add (line 29) | add(e){
    method openNode (line 30) | openNode(e){const n=r({scope:e})
    method closeNode (line 31) | closeNode(){
    method closeAllNodes (line 32) | closeAllNodes(){
    method toJSON (line 33) | toJSON(){return JSON.stringify(this.rootNode,null,4)}
    method walk (line 34) | walk(e){return this.constructor._walk(e,this.rootNode)}
    method _walk (line 34) | static _walk(e,n){
    method _collapse (line 36) | static _collapse(e){
  class l (line 38) | class l extends o{constructor(e){super(),this.options=e}
    method constructor (line 38) | constructor(e){super(),this.options=e}
    method addText (line 39) | addText(e){""!==e&&this.add(e)}
    method startScope (line 39) | startScope(e){this.openNode(e)}
    method endScope (line 39) | endScope(){
    method __addSublanguage (line 40) | __addSublanguage(e,n){const t=e.root
    method toHTML (line 41) | toHTML(){
    method finalize (line 42) | finalize(){
  function c (line 43) | function c(e){
  function d (line 44) | function d(e){return b("(?=",e,")")}
  function g (line 45) | function g(e){return b("(?:",e,")*")}
  function u (line 45) | function u(e){return b("(?:",e,")?")}
  function b (line 46) | function b(...e){return e.map((e=>c(e))).join("")}
  function m (line 46) | function m(...e){const n=(e=>{
  function p (line 50) | function p(e){return RegExp(e.toString()+"|").exec("").length-1}
  function f (line 52) | function f(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t
  function T (line 84) | function T(e,n){
  function R (line 85) | function R(e,n){
  function D (line 86) | function D(e,n){
  function I (line 89) | function I(e,n){
  function B (line 90) | function B(e,n){
  function L (line 93) | function L(e,n){
  function U (line 101) | function U(e,n,t=z){const a=Object.create(null)
  function j (line 105) | function j(e,n){
  function q (line 109) | function q(e,n,{key:t}){let a=0;const i=e[t],s={},r={}
  function W (line 111) | function W(e){(e=>{
  function X (line 124) | function X(e){
  function Q (line 171) | function Q(e){
  class V (line 172) | class V extends Error{
    method constructor (line 173) | constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}
  function h (line 180) | function h(e){
  function f (line 181) | function f(e,n,t){let a="",i=""
  function _ (line 187) | function _(e,t,i,s){
  function E (line 251) | function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{
  function N (line 258) | function N(e){let n=null;const t=(e=>{
  function w (line 276) | function w(){
  function v (line 278) | function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]}
  function k (line 279) | function k(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{
  function x (line 280) | function x(e){const n=v(e)
  function O (line 281) | function O(e,n){const t=e;s.forEach((e=>{
  function be (line 318) | function be(e,n,t){return-1===t?"":e.replace(n,(a=>be(e,n,t-1)))}

FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/script.js
  function initSideNav (line 6) | function initSideNav() {
  function saveLeftScroll (line 30) | function saveLeftScroll() {
  function saveMainContentScroll (line 36) | function saveMainContentScroll() {
  function saveRightScroll (line 42) | function saveRightScroll() {
  function restoreScrolls (line 48) | function restoreScrolls() {
  function initScrollSave (line 75) | function initScrollSave() {
  function findMatches (line 99) | function findMatches(index, query) {
  function initializeSearch (line 160) | function initializeSearch(input, index) {
  function disableSearch (line 451) | function disableSearch() {

FILE: code/pt_Br/na_pratica/07_logger_package/example/main.dart
  function main (line 3) | void main()

FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/log.dart
  type Cores (line 4) | enum Cores {
  type Nivel (line 24) | enum Nivel { info, warning, error }
  class Logger (line 28) | class Logger {
    method info (line 41) | void info(Object object)
    method warning (line 46) | void warning(Object object)
    method error (line 53) | void error(Object object)
    method _habilitado (line 60) | bool _habilitado(Nivel nivelHabilitado)

FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/printer.dart
  class Printer (line 6) | class Printer {
    method log (line 19) | void log(Cores cor, Object object)

FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/printer_console.dart
  function log (line 2) | void log(Object object)

FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/printer_io.dart
  function log (line 4) | void log(Object object)

FILE: code/pt_Br/na_pratica/11_climatempo/bin/climatempo.dart
  function main (line 7) | void main(List<String> args)
  function registrarCidadeEBuscarTempo (line 39) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 44) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 53) | ArgParser criarParser()

FILE: code/pt_Br/na_pratica/11_climatempo/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/na_pratica/11_climatempo/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/na_pratica/11_climatempo/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 12) | String toString()

FILE: code/pt_Br/na_pratica/11_climatempo/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/na_pratica/13_climatempo_client/bin/climatempo_client.dart
  function main (line 4) | void main(List<String> args)

FILE: code/pt_Br/na_pratica/13_climatempo_server/bin/climatempo.dart
  function main (line 8) | void main(List<String> args)
  function registrarCidadeEBuscarTempo (line 44) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 49) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 58) | ArgParser criarParser()

FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/bin/climatempo.dart
  function main (line 9) | void main(List<String> args)
  function registrarCidadeEBuscarTempo (line 47) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 52) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 61) | ArgParser criarParser()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/log.dart
  function _validarDiretorio (line 7) | Future<void> _validarDiretorio()
  function salvarCidades (line 14) | Future<void> salvarCidades(List<Cidade> cidades)
  function salvarTempo (line 23) | Future<void> salvarTempo(ClimaTempo climaTempo)

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/bin/climatempo.dart
  function main (line 9) | void main(List<String> args)
  function registrarCidadeEBuscarTempo (line 47) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 52) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 61) | ArgParser criarParser()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/log.dart
  function _validarDiretorio (line 8) | Future<void> _validarDiretorio()
  function salvarTempoIsolate (line 15) | Future<void> salvarTempoIsolate(ClimaTempo climaTempo)
  function salvarTempo (line 20) | Future<void> salvarTempo(ClimaTempo climaTempo)
  function _registrarCallbackFinalizacao (line 26) | void _registrarCallbackFinalizacao(Isolate isolate)
  function salvarCidadesIsolate (line 36) | Future<void> salvarCidadesIsolate(List<Cidade> cidades)
  function salvarCidades (line 41) | Future<void> salvarCidades(List<Cidade> cidades)

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart
  function main (line 10) | void main(List<String> args)
  function executar (line 20) | Future<void> executar(List<String> args)
  function registrarCidadeEBuscarTempo (line 54) | Future<ClimaTempo> registrarCidadeEBuscarTempo(int idCidade)
  function mostrarAjuda (line 59) | void mostrarAjuda(ArgParser parser)
  function criarParser (line 68) | ArgParser criarParser()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/alerta_server.dart
  class AlertaServer (line 4) | class AlertaServer {
    method start (line 5) | Stream<String> start()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/api.dart
  function buscarCidades (line 9) | Future<List<Cidade>> buscarCidades({String? nome, String? estado})
  function registrarCidade (line 23) | Future<void> registrarCidade({required int idCidade})
  function climaAtual (line 29) | Future<ClimaTempo> climaAtual({required int idCidade})

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/log.dart
  function _validarDiretorio (line 8) | Future<void> _validarDiretorio()
  function salvarTempoIsolate (line 15) | Future<void> salvarTempoIsolate(ClimaTempo climaTempo)
  function salvarTempo (line 20) | Future<void> salvarTempo(ClimaTempo climaTempo)
  function _registrarCallbackFinalizacao (line 26) | void _registrarCallbackFinalizacao(Isolate isolate)
  function salvarCidadesIsolate (line 36) | Future<void> salvarCidadesIsolate(List<Cidade> cidades)
  function salvarCidades (line 41) | Future<void> salvarCidades(List<Cidade> cidades)
  function salvarErro (line 50) | Future<void> salvarErro(Object erro, StackTrace stackTrace)
  function _doisDigitos (line 65) | String _doisDigitos(int numero)

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/cidade.dart
  class Cidade (line 1) | class Cidade {
    method toString (line 13) | String toString()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/clima_tempo.dart
  class ClimaTempo (line 4) | class ClimaTempo {
    method toString (line 11) | String toString()

FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/tempo.dart
  class Tempo (line 1) | class Tempo {

FILE: website/src/components/layout/layout.js
  class Layout (line 10) | class Layout extends React.Component {
    method constructor (line 11) | constructor(props) {
    method componentDidMount (line 17) | componentDidMount() {
    method changeTheme (line 24) | changeTheme() {
    method render (line 33) | render() {
Condensed preview — 487 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (858K chars).
[
  {
    "path": ".github/workflows/deploy.yaml",
    "chars": 660,
    "preview": "name: DartGuide Deploy\n\non:\n  push:\n    branches:\n      - master\n    paths:\n      - 'website/**'\n\njobs:\n  build_deploy:\n"
  },
  {
    "path": ".gitignore",
    "chars": 180,
    "preview": "# Files and directories created by pub.\n.dart_tool/\n.packages\n\n# Conventional directory for build output.\nbuild/\n\n# Mac\n"
  },
  {
    "path": "CNAME",
    "chars": 13,
    "preview": "dartguide.dev"
  },
  {
    "path": "README.md",
    "chars": 2254,
    "preview": "<p align=\"center\" width=\"100%\">\n    <img width=\"50%\" src=\"https://github.com/JHBitencourt/dart-book/blob/master/website/"
  },
  {
    "path": "code/pt_Br/01_capitulo/01_primeiro_programa/main.dart",
    "chars": 59,
    "preview": "// Primeiro programa o/\nmain() {\n  print('Hello World!');\n}"
  },
  {
    "path": "code/pt_Br/01_capitulo/02_erro_main/main.dart",
    "chars": 170,
    "preview": "// Tente executar esse arquivo\n// Você deverá ver o erro:\n// Dart_LoadScriptFromKernel: The binary program does not cont"
  },
  {
    "path": "code/pt_Br/02_capitulo/01_operadores_aritmeticos/main.dart",
    "chars": 219,
    "preview": "void main() {\n  print(40 + 2); // > 42\n  print('40' + '2'); // > 402\n  print(50 - 8); // > 42\n  print(-(-42)); // > 42\n "
  },
  {
    "path": "code/pt_Br/02_capitulo/02_operadores_relacionais_equalidade/main.dart",
    "chars": 190,
    "preview": "void main() {\n  print(42 == 42); // > true\n  print(42 != 42); // > false\n  print(42 > 42); // > false\n  print(42 >= 42);"
  },
  {
    "path": "code/pt_Br/02_capitulo/03_operadores_logicos/main.dart",
    "chars": 169,
    "preview": "void main() {\n  print(42 == 42 && 42 <= 10); // > false\n  print((42 == 42 && 42 <= 10) || 42 != 42); // > false\n  print("
  },
  {
    "path": "code/pt_Br/02_capitulo/04_operador_bit_and/main.dart",
    "chars": 239,
    "preview": "void main() {\n  var and = 42 & 27;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(27.toRadixString("
  },
  {
    "path": "code/pt_Br/02_capitulo/05_operador_bit_or/main.dart",
    "chars": 236,
    "preview": "void main() {\n  var or = 42 | 27;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(27.toRadixString(2"
  },
  {
    "path": "code/pt_Br/02_capitulo/06_operador_bit_xor/main.dart",
    "chars": 239,
    "preview": "void main() {\n  var xor = 42 ^ 27;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(27.toRadixString("
  },
  {
    "path": "code/pt_Br/02_capitulo/07_operador_bit_not/main.dart",
    "chars": 159,
    "preview": "void main() {\n  var not = ~42;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(not); // > -43\n  prin"
  },
  {
    "path": "code/pt_Br/02_capitulo/08_operador_bit_shift_direita/main.dart",
    "chars": 185,
    "preview": "void main() {\n  var shift = 42 >> 1;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(shift); // > 21"
  },
  {
    "path": "code/pt_Br/02_capitulo/09_operador_bit_shift_esquerda/main.dart",
    "chars": 186,
    "preview": "void main() {\n  var shift = 42 << 2;\n  print(42.toRadixString(2).padLeft(8, '0')); // > 00101010\n  print(shift); // > 16"
  },
  {
    "path": "code/pt_Br/02_capitulo/10_operador_bit_shift_direita_unsigned/main.dart",
    "chars": 248,
    "preview": "void main() {\n  var shift = -42 >>> 1;\n  print((-42).toRadixString(2).padLeft(8, '0')); // > 0-101010\n  print(shift); //"
  },
  {
    "path": "code/pt_Br/02_capitulo/11_operador_atribuicao/main.dart",
    "chars": 424,
    "preview": "void main() {\n  num a = 4;\n  print(a); // > 4\n  a += 5;\n  print(a); // > 9\n  a -= 4;\n  print(a); // > 5\n  a %= 2;\n  prin"
  },
  {
    "path": "code/pt_Br/02_capitulo/12_operador_incremento_decremento_1/main.dart",
    "chars": 175,
    "preview": "void main() {\n  var a = 0;\n  var b = 1 + ++a; // 1 + 1\n  print(a); // > 1\n  print(b); // > 2\n  var c = 0;\n  var d = 1 + "
  },
  {
    "path": "code/pt_Br/02_capitulo/13_operador_incremento_decremento_2/main.dart",
    "chars": 174,
    "preview": "void main() {\n  var a = 0;\n  var b = 1 + a++; // 1 + 0\n  print(a); // > 1\n  print(b); // > 1\n  var c = 0;\n  var d = 1 + "
  },
  {
    "path": "code/pt_Br/02_capitulo/14_operador_validacao_tipo_1/main.dart",
    "chars": 165,
    "preview": "void main() {\n  num a = 42;\n\n  // Ao descomentar a linha abaixo irá produzir um erro de cast de tipo inválido\n  // a = 4"
  },
  {
    "path": "code/pt_Br/02_capitulo/15_operador_validacao_tipo_2/main.dart",
    "chars": 226,
    "preview": "void main() {\n  num a = 42.5;\n\n  // O operador is permite validar o tipo para evitar erros de cast\n  if (a is int) {\n   "
  },
  {
    "path": "code/pt_Br/02_capitulo/16_operador_cascade/main.dart",
    "chars": 298,
    "preview": "// Sem o operador cascade:\n// final frase = StringBuffer();\n// frase.write('Operação ');\n// frase.write('em ');\n// frase"
  },
  {
    "path": "code/pt_Br/02_capitulo/17_operador_spread/main.dart",
    "chars": 177,
    "preview": "void main() {\n  final vogais = ['a', 'e', 'i'];\n  final consoantes = ['b', 'c', 'd'];\n  final alfabeto = [...vogais, ..."
  },
  {
    "path": "code/pt_Br/02_capitulo/18_operador_ternario/main.dart",
    "chars": 87,
    "preview": "void main() {\n  int numero = 42;\n  print(numero % 2 == 0 ? 'par' : 'ímpar'); // > par\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/19_operador_acesso/main.dart",
    "chars": 231,
    "preview": "void main() {\n  final map = {\n    'vogais': 'a,e,i,o,u',\n    'consoantes': 'b,c,d,...',\n  };\n  final vogais = ['a', 'e',"
  },
  {
    "path": "code/pt_Br/02_capitulo/20_operador_ternario_nulo/main.dart",
    "chars": 85,
    "preview": "void main() {\n  int? a = null;\n  var resposta = a ?? 42;\n  print(resposta); // > 42\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/21_operador_atribuicao_nulo/main.dart",
    "chars": 85,
    "preview": "void main() {\n  int? resposta = null;\n  resposta ??= 42;\n  print(resposta); // > 42\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/22_operador_acesso_nulo/main.dart",
    "chars": 79,
    "preview": "void main() {\n  int? resposta = null;\n  print(resposta?.bitLength); // > null\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/23_operador_cascade_nulo/main.dart",
    "chars": 144,
    "preview": "void main() {\n  StringBuffer? frase = null;\n  frase?..write('Operação ')\n    ..write('em ')\n    ..write('cascade.');\n  p"
  },
  {
    "path": "code/pt_Br/02_capitulo/24_operador_acesso_itens_nulo/main.dart",
    "chars": 70,
    "preview": "void main() {\n  List<String>? vogais;\n  print(vogais?[1]); // > null\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/25_operador_bang/main.dart",
    "chars": 60,
    "preview": "void main() {\n  List<String>? vogais;\n  print(vogais![1]);\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/26_precedencia_operadores/main.dart",
    "chars": 42,
    "preview": "void main() {\n  print(1+6/2*3-6); // > 4\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/27_if_else/main.dart",
    "chars": 440,
    "preview": "void main() {\n  var resposta = 20;\n  if (resposta != 42) {\n    print('A resposta está errada'); // > A resposta está err"
  },
  {
    "path": "code/pt_Br/02_capitulo/28_switch_case/main.dart",
    "chars": 769,
    "preview": "void main() {\n  var estacao = 'Verão';\n  switch (estacao) {\n    case 'Outono':\n    case 'Verão':\n      print('Tá calor')"
  },
  {
    "path": "code/pt_Br/02_capitulo/29_switch_case_patterns/main.dart",
    "chars": 365,
    "preview": "void main() {\n  var nota = 8;\n  switch (nota) {\n    case 0:\n      print('Sério?');\n    case 1 || 2 || 3:\n      print('Es"
  },
  {
    "path": "code/pt_Br/02_capitulo/30_switch_case_expressions/main.dart",
    "chars": 297,
    "preview": "void main() {\n  var nota = 9;\n  var mensagem = switch (nota) {\n    0 => 'Sério?',\n    1 || 2 || 3 => 'Estudar mais, urge"
  },
  {
    "path": "code/pt_Br/02_capitulo/31_if_case/main.dart",
    "chars": 206,
    "preview": "void main() {\n  var coordenadas = [10, 42];\n  if (coordenadas case [int x, int y]) {\n    print('Coordenadas: (x:$x,y:$y)"
  },
  {
    "path": "code/pt_Br/02_capitulo/32_if_case_when/main.dart",
    "chars": 152,
    "preview": "void main() {\n  var coordenadas = [10, -42];\n  if (coordenadas case [int x, int y] when x >= 0 && y >= 0) {\n    print('C"
  },
  {
    "path": "code/pt_Br/02_capitulo/33_while/main.dart",
    "chars": 88,
    "preview": "void main() {\n  var index = 0;\n  while(index < 3) {\n    print(index);\n    index++;\n  }\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/34_do_while/main.dart",
    "chars": 80,
    "preview": "void main() {\n  do {\n    print('Executado'); // > Executado\n  } while (false);\n}"
  },
  {
    "path": "code/pt_Br/02_capitulo/35_for/main.dart",
    "chars": 236,
    "preview": "void main() {\n  for(var i = 0; i <= 10; i = i+2) {\n    print(i); // > 0 2 4 6 8 10\n  }\n\n  // for com continue e break\n  "
  },
  {
    "path": "code/pt_Br/02_capitulo/36_for_nomeado/main.dart",
    "chars": 212,
    "preview": "void main() {\n  forDeFora:\n  for (var i = 0; i <= 2; i++) {\n    print('forDeFora $i');\n    for (var j = 0; j <= 2; j++) "
  },
  {
    "path": "code/pt_Br/02_capitulo/37_for_in/main.dart",
    "chars": 182,
    "preview": "void main() {\n  final vogais = ['a', 'e', 'i', 'o', 'u'];\n  for(final vogal in vogais) {\n    if(vogal == 'e') continue;\n"
  },
  {
    "path": "code/pt_Br/02_capitulo/38_assert/main.dart",
    "chars": 127,
    "preview": "void main() {\n  final vogais = ['a', 'e', 'i', 'o', 'u', 'j'];\n  assert(vogais.length == 5, 'Só deveriam existir 5 vogai"
  },
  {
    "path": "code/pt_Br/03_capitulo/01_coercao/main.dart",
    "chars": 191,
    "preview": "// Coerção implícita em javascript:\n// var a = \"Resposta: \" + 42;\n// console.log(a); // >\t\"Resposta:\t42\"\n\nvoid main() {\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/02_dart_analyzer_1/main.dart",
    "chars": 114,
    "preview": "bool erro = true;\n\nvoid main() {\n  // O analisador de dart apontará um erro no código abaixo:\n  erro = 'false';\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/03_dart_analyzer_2/main.dart",
    "chars": 53,
    "preview": "bool erro = true;\n\nvoid main() {\n  erro as String;\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/04_inferencia_tipo/main.dart",
    "chars": 142,
    "preview": "void main() {\n  int continentes = 6;\n  print(continentes.runtimeType); // > int\n  var planetas = 8;\n  print(planetas.run"
  },
  {
    "path": "code/pt_Br/03_capitulo/05_inferencia_tipo_parametros/main.dart",
    "chars": 225,
    "preview": "void main() {\n  var somaInt = soma(1, 2);\n  var somaString = soma('1', '2');\n  print('$somaInt: ${somaInt.runtimeType}')"
  },
  {
    "path": "code/pt_Br/03_capitulo/06_dynamic/main.dart",
    "chars": 145,
    "preview": "void main() {\n  dynamic objeto = 42;\n  // Uma exceção será lançada em tempo de execução:\n  objeto.metodoQueNemExiste(); "
  },
  {
    "path": "code/pt_Br/03_capitulo/07_numeros/main.dart",
    "chars": 269,
    "preview": "void main() {\n  int a = 5;\n  double b = 8.2;\n  double c = 1;\n  num x = (a * b) + c;\n  print('Resultado: $x'); // > Resul"
  },
  {
    "path": "code/pt_Br/03_capitulo/08_booleanos/main.dart",
    "chars": 317,
    "preview": "void main() {\n  bool verdadeiro = true;\n  bool falso = false;\n  bool primeiroMaior = 'Esse é muito maior'.length > 'Esse"
  },
  {
    "path": "code/pt_Br/03_capitulo/09_symbols/main.dart",
    "chars": 185,
    "preview": "void main() {\n  var mod = #modificador;\n  print(#modificador); // > Symbol(\"modificador\")\n  print(mod); // > Symbol(\"mod"
  },
  {
    "path": "code/pt_Br/03_capitulo/10_null_safety/main.dart",
    "chars": 117,
    "preview": "// A null-safety em Dart não permite que o código abaixo compile\nvoid main() {\n  int valor;\n  print(valor.isEven);\n}\n"
  },
  {
    "path": "code/pt_Br/03_capitulo/11_nullable_types/main.dart",
    "chars": 371,
    "preview": "void main() {\n  printNome('Douglas', 'Adams');\n  printNome('Douglas', null);\n}\n\nvoid printNome(String nome, String? sobr"
  },
  {
    "path": "code/pt_Br/03_capitulo/12_type_promotion/main.dart",
    "chars": 368,
    "preview": "void main() {\n  print(textoGrande(42));\n  print(textoGrande('Este tem que ser um texto muito grande com mais de 120 '\n  "
  },
  {
    "path": "code/pt_Br/03_capitulo/13_type_promotion_nullable/main.dart",
    "chars": 547,
    "preview": "void main() {\n  print(letrasNome('Julio', 'Bitencourt'));\n  print(letrasNome('Julio', null));\n\n  print(letrasNome2('Juli"
  },
  {
    "path": "code/pt_Br/03_capitulo/14_operador_bang/main.dart",
    "chars": 310,
    "preview": "String? nome;\n\nvoid main() {\n  nome = 'Julio';\n\n  // Erro de compilação, afinal nome é uma variável global:\n  // if (nom"
  },
  {
    "path": "code/pt_Br/03_capitulo/15_strings/main.dart",
    "chars": 216,
    "preview": "void main() {\n  //String('Erro'); // Sem construtor default\n  var a = '42'; // Forma literal\n  print(a); // > 42\n  print"
  },
  {
    "path": "code/pt_Br/03_capitulo/16_surrogate_pairs/main.dart",
    "chars": 280,
    "preview": "void main() {\n  var spock = '\\u{1f596}';\n  print(spock); // Imprime o símbolo\n  print(spock.length); // > 2\n  print(spoc"
  },
  {
    "path": "code/pt_Br/03_capitulo/17_criacao_strings/main.dart",
    "chars": 283,
    "preview": "void main() {\n  print(\"Aspas duplas com 'aspas simples'\");\n  // > Aspas duplas com 'aspas simples'\n  print('Aspas simple"
  },
  {
    "path": "code/pt_Br/03_capitulo/18_interpolacao_strings/main.dart",
    "chars": 308,
    "preview": "var resposta = 42;\n\nvoid main() {\n  print('''A resposta para a vida\n    o universo\n    e tudo mais é: $resposta''');\n  p"
  },
  {
    "path": "code/pt_Br/03_capitulo/19_otimizacao_strings/main.dart",
    "chars": 264,
    "preview": "var elonUm = 'Elon Musk';\nvar elonDois = 'Elon Musk';\nvar jeff = 'Jeff Bezos';\n\nvoid main() {\n  print(elonUm == jeff); /"
  },
  {
    "path": "code/pt_Br/03_capitulo/20_strings_sob_demanda/main.dart",
    "chars": 333,
    "preview": "void main() {\n  print('Dart' + ' é ' + 'incrível!'); // > Dart é incrível!\n  print('Dart' ' é ' 'incrível!'); // > Dart "
  },
  {
    "path": "code/pt_Br/03_capitulo/21_strings_geral/main.dart",
    "chars": 847,
    "preview": "String e = 'Douglas Adams';\n\nvoid main() {\n  print('Vazio: ${e.isEmpty}'); // > Vazio: false\n  print(\"Adicionando à esqu"
  },
  {
    "path": "code/pt_Br/03_capitulo/22_variaveis_var/main.dart",
    "chars": 191,
    "preview": "var pi = 3.14;\ndouble y = pi;\nvar x = 'Arquimedes';\nString? matematico;\n\nvoid main() {\n  //x = y; // Erro, x já possui o"
  },
  {
    "path": "code/pt_Br/03_capitulo/23_variaveis_static/main.dart",
    "chars": 325,
    "preview": "//static var global = 'String global'; // Erro\nclass Livro {\n  static int instancias = 0;\n\n  Livro() {\n    instancias++;"
  },
  {
    "path": "code/pt_Br/03_capitulo/24_variaveis_final_const/main.dart",
    "chars": 935,
    "preview": "// const double pi =  3.14;\nconst pi = 3.14;\n// final double circunferencia = 2 * pi;\nfinal circunferencia = 2 * pi;\n\n//"
  },
  {
    "path": "code/pt_Br/03_capitulo/25_variaveis_late/main.dart",
    "chars": 295,
    "preview": "class Pizza {\n  // int pedacos;\n  late int pedacos;\n\n  void media() {\n    pedacos = 8;\n  }\n\n  void grande() {\n    pedaco"
  },
  {
    "path": "code/pt_Br/04_capitulo/01_fatorial/main.dart",
    "chars": 245,
    "preview": "void main() {\n  print(fatorial(4));\n  print(fatorial(0));\n  print(fatorial(42));\n}\n\nint fatorial(int numero) {\n  if (num"
  },
  {
    "path": "code/pt_Br/04_capitulo/02_escopo/main.dart",
    "chars": 383,
    "preview": "var escopoGlobal = 'global';\n\nvoid main() {\n  var escopoMain = 'escopoMain';\n  a() {\n    var escopoDentro = 'escopoA';\n "
  },
  {
    "path": "code/pt_Br/04_capitulo/03_tipo_function/main.dart",
    "chars": 301,
    "preview": "var ola = (String nome) {\n  print('Olá $nome');\n};\nFunction hello = (String nome) => print('Olá $nome');\n\nvoid main() {\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/04_retornos/main.dart",
    "chars": 482,
    "preview": "void main() {\n  print(retornoNulo());\n  print(retornoNuloDois());\n  print(retornoString());\n\n  /// Um retorno void não p"
  },
  {
    "path": "code/pt_Br/04_capitulo/05_never/main.dart",
    "chars": 102,
    "preview": "import 'dart:io';\n\nvoid main() {\n  print('Antes de encerrar');\n  exit(0);\n  print('Após encerrar');\n}\n"
  },
  {
    "path": "code/pt_Br/04_capitulo/06_escopo_closure/main.dart",
    "chars": 190,
    "preview": "Function criaClosure() {\n  var resposta = 42;\n  return () {\n    resposta++;\n    print(resposta);\n  };\n}\n\nvoid main() {\n "
  },
  {
    "path": "code/pt_Br/04_capitulo/07_tear_off/main.dart",
    "chars": 152,
    "preview": "void main() {\n  final vogais = ['a', 'e', 'i', 'o', 'u'];\n  vogais.forEach((e) {\n    print(e);\n  });\n\n  /// Usando tear-"
  },
  {
    "path": "code/pt_Br/04_capitulo/08_parametro_posicional_obrigatorio/main.dart",
    "chars": 224,
    "preview": "/// Parâmetros: posicional e obrigatório\nvoid temperaturaEm(String cidade, int? ano, int? mes, int dia) {\n  print('$cida"
  },
  {
    "path": "code/pt_Br/04_capitulo/09_parametro_posicional_opcional/main.dart",
    "chars": 366,
    "preview": "void temperaturaEm(String cidade, [int? ano = 2020, int? mes, int dia = 01]) {\n  print('$cidade $dia/$mes/$ano');\n}\n\nvoi"
  },
  {
    "path": "code/pt_Br/04_capitulo/10_parametro_nomeado_opcional/main.dart",
    "chars": 332,
    "preview": "void temperaturaEm(String cidade, {int? ano = 2020, int dia = 01, int? mes}) {\n  print('$cidade $dia/$mes/$ano');\n}\n\nvoi"
  },
  {
    "path": "code/pt_Br/04_capitulo/11_parametro_nomeado_obrigatorio/main.dart",
    "chars": 368,
    "preview": "void temperaturaEm(String cidade,\n    {required int dia, required int? mes, int? ano = 2020}) {\n  print('$cidade $dia/$m"
  },
  {
    "path": "code/pt_Br/04_capitulo/12_enums/main.dart",
    "chars": 1026,
    "preview": "const double G = 6.67300e-11;\n\nenum Planeta {\n  mercurio(3.303e+23, 2.4397e6, aneis: false),\n  venus(4.869e+24, 6.0518e6"
  },
  {
    "path": "code/pt_Br/04_capitulo/13_typedef/main.dart",
    "chars": 372,
    "preview": "typedef Operacao = Object Function(double a, double b);\n\ndouble somar(double a, double b) {\n  return a + b;\n}\n\nString su"
  },
  {
    "path": "code/pt_Br/05_capitulo/01_errors/main.dart",
    "chars": 145,
    "preview": "void main() {\n  var lista = <int>[1, 2];\n  for (var i = 0; i <= 2; i++) {\n    print('Atribuindo valor $i no índice $i');"
  },
  {
    "path": "code/pt_Br/05_capitulo/02_exceptions/main.dart",
    "chars": 175,
    "preview": "import 'dart:io';\n\nvoid main() {\n  // Um formato inválido informado resultará em FormatException\n  final dataUsuario = s"
  },
  {
    "path": "code/pt_Br/05_capitulo/03_throw/main.dart",
    "chars": 148,
    "preview": "void voar() {\n  throw Exception('Você não tem asas!');\n}\n\nvoid ligarCarro() => throw 'Sem gasolina!';\n\nvoid main() {\n  /"
  },
  {
    "path": "code/pt_Br/05_capitulo/04_exception_customizada/main.dart",
    "chars": 289,
    "preview": "class SemGasolinaException implements Exception {\n  final String mensagem;\n\n  const SemGasolinaException(this.mensagem);"
  },
  {
    "path": "code/pt_Br/05_capitulo/05_assert/main.dart",
    "chars": 76,
    "preview": "void main() {\n  int? id;\n  assert(id != null, 'O id não pode ser nulo.');\n}\n"
  },
  {
    "path": "code/pt_Br/05_capitulo/06_assert_x_error/main.dart",
    "chars": 914,
    "preview": "import 'dart:math';\n\nvoid main() {\n  // calcularCircunferencia(-2);\n  calcularCircunferenciaError(-2);\n\n  Motorista('', "
  },
  {
    "path": "code/pt_Br/05_capitulo/07_try_catch/main.dart",
    "chars": 216,
    "preview": "void comer() => throw Exception('Acabou a comida..');\n\nvoid main() {\n  try {\n    comer();\n    print('Não vai chegar aqui"
  },
  {
    "path": "code/pt_Br/05_capitulo/08_try_catch_on/main.dart",
    "chars": 268,
    "preview": "void main() {\n  try {\n    DateTime.parse('01/01/2022');\n    // DateTime.parse('2022-01-22');\n  } on FormatException catc"
  },
  {
    "path": "code/pt_Br/05_capitulo/09_try_catch_exception/main.dart",
    "chars": 276,
    "preview": "void comer() => throw 'Acabou\ta\tcomida..';\n\nvoid main() {\n  try {\n    comer();\n  } on FormatException catch (e) {\n    pr"
  },
  {
    "path": "code/pt_Br/05_capitulo/10_try_catch_finally/main.dart",
    "chars": 399,
    "preview": "import 'dart:async';\n\nvoid main() {\n  try {\n    abrirConexao();\n    buscarDados();\n    // fecharConexao();\n  } catch (e,"
  },
  {
    "path": "code/pt_Br/06_capitulo/01_codigo_ansi/main.dart",
    "chars": 199,
    "preview": "import 'dart:io';\n\nvoid error(Object object) {\n  stdout.writeln('\\x1b[31m[ERROR]\t$object\\x1b[m');\n}\n\nvoid main() {\n  ///"
  },
  {
    "path": "code/pt_Br/07_capitulo/01_analyzer/main.dart",
    "chars": 336,
    "preview": "/// Execute o analyzer neste arquivo e deverá ser apontado 1 erro e nenhuma\n/// melhoria. Afinal, ele não possui um lint"
  },
  {
    "path": "code/pt_Br/07_capitulo/02_analyzer_linter/analysis_options.yaml",
    "chars": 156,
    "preview": "linter:\n  rules:\n    - camel_case_types\n    - non_constant_identifier_names\n    - avoid_init_to_null\n    - always_declar"
  },
  {
    "path": "code/pt_Br/07_capitulo/02_analyzer_linter/main.dart",
    "chars": 342,
    "preview": "/// Execute o analyzer neste arquivo e deverá ser apontado 5 melhorias.\n/// Afinal, ele possui o linter configurado em a"
  },
  {
    "path": "code/pt_Br/07_capitulo/03_comments/main.dart",
    "chars": 434,
    "preview": "// TODO finalizar este método\nvoid imprimirValor() {\n  print(42); // Imprime sempre 42.\n}\n\n/* // TODO finalizar este mét"
  },
  {
    "path": "code/pt_Br/08_capitulo/01_objeto/main.dart",
    "chars": 344,
    "preview": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  "
  },
  {
    "path": "code/pt_Br/08_capitulo/02_to_string/main.dart",
    "chars": 272,
    "preview": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  "
  },
  {
    "path": "code/pt_Br/08_capitulo/03_equalidade/main.dart",
    "chars": 431,
    "preview": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  "
  },
  {
    "path": "code/pt_Br/08_capitulo/04_sobrescrita_operadores/main.dart",
    "chars": 612,
    "preview": "class Programador {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n  List<String>? linguagens;\n\n  "
  },
  {
    "path": "code/pt_Br/08_capitulo/05_construtor_padrao/main.dart",
    "chars": 813,
    "preview": "class Programador {\n  // Programador(String nome, List<String> linguagens) {\n  //   this.nome = nome;\n  //   this.lingua"
  },
  {
    "path": "code/pt_Br/08_capitulo/06_construtor_nomeado/main.dart",
    "chars": 677,
    "preview": "class Programador {\n  Programador({\n    this.nome = 'Fulano',\n    this.linguagens = const [],\n  });\n\n  Programador.dart("
  },
  {
    "path": "code/pt_Br/08_capitulo/07_construtor_const/main.dart",
    "chars": 369,
    "preview": "class LinguagemProgramacao {\n  const LinguagemProgramacao(this.nome);\n\n  final String nome;\n}\n\nvoid main() {\n  final pri"
  },
  {
    "path": "code/pt_Br/08_capitulo/08_construtor_factory/main.dart",
    "chars": 609,
    "preview": "class Programador {\n  Programador._internal(this.nome);\n\n  factory Programador(String nome) {\n    if (_cache.containsKey"
  },
  {
    "path": "code/pt_Br/08_capitulo/09_encapsulamento/main.dart",
    "chars": 741,
    "preview": "// class Programador {\n//   DateTime? nascimento;\n// }\n//\n// void main() {\n//   final p1 = Programador();\n//   p1.nascim"
  },
  {
    "path": "code/pt_Br/08_capitulo/10_heranca/main.dart",
    "chars": 785,
    "preview": "class Funcionario {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n\n  void trabalhar() {\n    print"
  },
  {
    "path": "code/pt_Br/08_capitulo/11_polimorfismo/main.dart",
    "chars": 729,
    "preview": "class Funcionario {\n  void trabalhar() {\n    print('Funcionario trabalhando..');\n  }\n}\n\nclass Programador extends Funcio"
  },
  {
    "path": "code/pt_Br/08_capitulo/12_classes_abstratas/main.dart",
    "chars": 948,
    "preview": "abstract class Funcionario {\n  String? nome;\n  double salario = 0.0;\n  List<String> tarefas = [];\n\n  void trabalhar();\n}"
  },
  {
    "path": "code/pt_Br/08_capitulo/13_interfaces/main.dart",
    "chars": 1439,
    "preview": "abstract class Assalariado {\n  Assalariado(this.salario);\n\n  double salario;\n\n  void receber();\n}\n\nabstract class Funcio"
  },
  {
    "path": "code/pt_Br/08_capitulo/14_mixins/main.dart",
    "chars": 1273,
    "preview": "mixin Assalariado on Funcionario {\n  double salario = 0;\n\n  void receber() {\n    print('Pegando o salário do ${super.nom"
  },
  {
    "path": "code/pt_Br/08_capitulo/15_mixins_a_fundo/main.dart",
    "chars": 227,
    "preview": "abstract class A {\n  String ola();\n}\n\nmixin B {\n  String ola() => 'Olá B';\n}\n\nmixin C {\n  String ola() => 'Olá C';\n}\n\ncl"
  },
  {
    "path": "code/pt_Br/08_capitulo/16_extension_methods/main.dart",
    "chars": 701,
    "preview": "String capitalizar(String texto) {\n  if (texto.isEmpty) return texto;\n  return '${texto[0].toUpperCase()}${texto.substri"
  },
  {
    "path": "code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/main.dart",
    "chars": 453,
    "preview": "import 'strings_extension.dart';\n\nString capitalizar(String texto) {\n  if (texto.isEmpty) return texto;\n  return '${text"
  },
  {
    "path": "code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/strings_extension.dart",
    "chars": 296,
    "preview": "extension StringExtension on String {\n  String capitalizar() =>\n      this.isEmpty ? this : '${this[0].toUpperCase()}${t"
  },
  {
    "path": "code/pt_Br/08_capitulo/18_classe_wrapper/main.dart",
    "chars": 387,
    "preview": "class Id {\n  Id(this._valor);\n  final int _valor;\n  \n  bool get isValid => _valor > 0;\n  Id get next => Id(_valor +1);\n\n"
  },
  {
    "path": "code/pt_Br/08_capitulo/19_extension_types/main.dart",
    "chars": 568,
    "preview": "import 'package:meta/meta.dart';\n\nextension type Id(int id) {\n  Id get next => Id(id + 1);\n  bool get isValid => id > 0;"
  },
  {
    "path": "code/pt_Br/08_capitulo/19_extension_types/pubspec.yaml",
    "chars": 289,
    "preview": "name: extensions\ndescription: A starting point for Dart libraries or applications.\nversion: 1.0.0\n# repository: https://"
  },
  {
    "path": "code/pt_Br/08_capitulo/20_modifiers_abstract/main.dart",
    "chars": 140,
    "preview": "abstract class A {}\nclass B extends A {}\nclass C implements A {}\n\n// Modificador abstract desabilita o instanciamento\nfi"
  },
  {
    "path": "code/pt_Br/08_capitulo/21_modifiers_interface/arquivo.dart",
    "chars": 20,
    "preview": "interface class A {}"
  },
  {
    "path": "code/pt_Br/08_capitulo/21_modifiers_interface/main.dart",
    "chars": 139,
    "preview": "import 'arquivo.dart';\n\n// Modificador interface desabilita a herança:\nclass B extends A {} // Erro\n\nclass C implements "
  },
  {
    "path": "code/pt_Br/08_capitulo/22_modifiers_base/arquivo.dart",
    "chars": 15,
    "preview": "base class A {}"
  },
  {
    "path": "code/pt_Br/08_capitulo/22_modifiers_base/main.dart",
    "chars": 147,
    "preview": "import 'arquivo.dart';\n\n\nbase class B extends A {}\nfinal a = A();\n\n// Modificador base desabilita o implements\nbase clas"
  },
  {
    "path": "code/pt_Br/08_capitulo/23_modifiers_final/arquivo.dart",
    "chars": 16,
    "preview": "final class A {}"
  },
  {
    "path": "code/pt_Br/08_capitulo/23_modifiers_final/main.dart",
    "chars": 154,
    "preview": "import 'arquivo.dart';\n\n//Modificador final desabilita subclasses e subtipos:\nclass B extends A {} // Erro\nclass C imple"
  },
  {
    "path": "code/pt_Br/08_capitulo/24_modifiers_sealed/main.dart",
    "chars": 388,
    "preview": "sealed class Poligono {}\nclass Pentagono extends Poligono {}\nsealed class Triangulo extends Poligono {}\nclass Isoceles e"
  },
  {
    "path": "code/pt_Br/09_capitulo/01_generics_1/main.dart",
    "chars": 402,
    "preview": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/02_generics_2/main.dart",
    "chars": 664,
    "preview": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/03_generics_3/main.dart",
    "chars": 630,
    "preview": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/04_generics_restringindo_tipo/main.dart",
    "chars": 627,
    "preview": "abstract class VeiculoAutomotor {}\n\nclass Carro extends VeiculoAutomotor {}\n\nclass Caminhao extends VeiculoAutomotor {}\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/05_generics_metodos/main.dart",
    "chars": 189,
    "preview": "T ultimo<T extends num>(List<T> itens) {\n  T ultimo = itens.last;\n  return ultimo;\n}\n\nvoid main() {\n  print(ultimo<int>("
  },
  {
    "path": "code/pt_Br/09_capitulo/06_lists/main.dart",
    "chars": 613,
    "preview": "void main() {\n  final vogais = [];\n  vogais.add('a');\n  vogais.add(42);\n  print(vogais);\n  print(vogais.runtimeType);\n\n "
  },
  {
    "path": "code/pt_Br/09_capitulo/07_iterando_lists/main.dart",
    "chars": 748,
    "preview": "void main() {\n  final risadas = <String>['kkk', 'haha', 'rsrs'];\n\n  /// Primeira forma de varrer uma lista:\n  /// Para q"
  },
  {
    "path": "code/pt_Br/09_capitulo/08_linked_hash_set/main.dart",
    "chars": 549,
    "preview": "import 'dart:collection';\n\n/// Todo Set por padrão implementa um LinkedHashSet,\n/// que mantém a ordem dos elementos ins"
  },
  {
    "path": "code/pt_Br/09_capitulo/09_hash_set/main.dart",
    "chars": 330,
    "preview": "import 'dart:collection';\n\n/// A implementação do HashSet não mantém a ordem de inserção.\n/// A ordem dos elementos é de"
  },
  {
    "path": "code/pt_Br/09_capitulo/10_splay_tree_set/main.dart",
    "chars": 635,
    "preview": "import 'dart:collection';\n\n/// A implementação do SplayTreeSet também não mantém a ordem de inserção.\n/// A ordem dos el"
  },
  {
    "path": "code/pt_Br/09_capitulo/11_queue/main.dart",
    "chars": 360,
    "preview": "import 'dart:collection';\n\nvoid main() {\n  final megasena = Queue<int>();\n  megasena.addAll([11, 35]);\n  print(megasena)"
  },
  {
    "path": "code/pt_Br/09_capitulo/12_map/main.dart",
    "chars": 1237,
    "preview": "import 'dart:collection';\n\nvoid main() {\n  final clientes = Map<int, String>();\n  clientes[1] = 'Rafael';\n  clientes[1] "
  },
  {
    "path": "code/pt_Br/09_capitulo/13_records/main.dart",
    "chars": 360,
    "preview": "void main() {\n  var turing = ('Alan Turing', 41, 1954);\n  var hawking = ('Stephen Hawking',);\n  var lovelace = ('Ada Lov"
  },
  {
    "path": "code/pt_Br/09_capitulo/14_records_tipados/main.dart",
    "chars": 314,
    "preview": "void main() {\n  (String, int, int) turing = ('Alan Turing', 41, 1954);\n  (String nome,) hawking = ('Stephen Hawking',);\n"
  },
  {
    "path": "code/pt_Br/09_capitulo/15_records_equalidade/main.dart",
    "chars": 305,
    "preview": "void main() {\n  (int x, int y, int z) coordenada1 = (10, 3, 4);\n  (int r, int g, int b) cor1 = (10, 3, 4);\n  print(coord"
  },
  {
    "path": "code/pt_Br/09_capitulo/16_records_retorno_funcao/main.dart",
    "chars": 551,
    "preview": "void main() {\n  var comprovante = comprovanteTransacao();\n  print(comprovante.$1); // > chavepix@gmail.com\n\n  var (chave"
  },
  {
    "path": "code/pt_Br/09_capitulo/17_pattern_matching/main.dart",
    "chars": 972,
    "preview": "void main() {\n  var list = [1, 2, 3, 4];\n  var [primeiro, ..., ultimo] = list;\n  print('$primeiro - $ultimo'); // > 1 - "
  },
  {
    "path": "code/pt_Br/09_capitulo/18_pattern_destructuring/main.dart",
    "chars": 382,
    "preview": "void main() {\n  final resposta = 42;\n  switch (resposta) {\n    case 42:\n      print('sentido da vida, do universo e tudo"
  },
  {
    "path": "code/pt_Br/09_capitulo/19_pattern_for_looping/main.dart",
    "chars": 159,
    "preview": "void main() {\n  var clientes = {1:'Bob', 2:'Ana'};\n  for(var MapEntry(:key, value: nome) in clientes.entries) {\n    prin"
  },
  {
    "path": "code/pt_Br/09_capitulo/20_pattern_collection_literal/main.dart",
    "chars": 151,
    "preview": "void main() {\n  var numeros = [-3, 4, 6, 1, -9, -4];\n  var positivos = [for (var n in numeros) if (n case > 0) n];\n  pri"
  },
  {
    "path": "code/pt_Br/10_capitulo/01_event_loop/main.dart",
    "chars": 411,
    "preview": "import 'dart:async';\nvoid main () {\n  print('Início main()');\n  Timer.run(() => print('Event loop 1')); // #E1\n  Timer.r"
  },
  {
    "path": "code/pt_Br/10_capitulo/02_programa_sincrono_1/main.dart",
    "chars": 149,
    "preview": "void main () {\n  print('Início main()');\n  int index = 0;\n  while(index < 10) {\n    print('Índice $index');\n    index++;"
  },
  {
    "path": "code/pt_Br/10_capitulo/03_programa_sincrono_2/main.dart",
    "chars": 281,
    "preview": "import 'dart:io';\n\nvoid main() {\n  print(temperaturaAtual());\n  print(previsaoAmanha());\n}\n\nString temperaturaAtual() {\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/04_future/main.dart",
    "chars": 381,
    "preview": "void main() {\n  final future = Future<int>(() {\n    return 84 ~/ 2;\n  }).then((int valor) {\n    print('Future em estado "
  },
  {
    "path": "code/pt_Br/10_capitulo/05_future_encadeado/main.dart",
    "chars": 362,
    "preview": "void main() {\n  buscarId().then((int id) {\n    print('Id encontrado, buscando nome..');\n    return buscarNome(id);\n  })."
  },
  {
    "path": "code/pt_Br/10_capitulo/06_erro_cadeia_assincrona/main.dart",
    "chars": 293,
    "preview": "Future<String> um() => Future.value('Primeiro');\nFuture<String> dois() => Future.error('Erro no dois()');\nFuture<String>"
  },
  {
    "path": "code/pt_Br/10_capitulo/07_erro_cadeia_try_catch/main.dart",
    "chars": 360,
    "preview": "Future<String> um() => Future.value('Primeiro');\n\nFuture<String> dois() => Future.error('Erro no dois()');\n\nFuture<Strin"
  },
  {
    "path": "code/pt_Br/10_capitulo/08_erro_cadeia_catch_error/main.dart",
    "chars": 370,
    "preview": "Future<String> um() => Future.value('Primeiro');\n\nFuture<String> dois() => Future.error('Erro no dois()');\n\nFuture<Strin"
  },
  {
    "path": "code/pt_Br/10_capitulo/09_erro_cadeia_on_error/main.dart",
    "chars": 447,
    "preview": "Future<String> um() => Future.value('Primeiro');\n\nFuture<String> dois() => Future.error('Erro no dois()');\n\nFuture<Strin"
  },
  {
    "path": "code/pt_Br/10_capitulo/10_future_sync/main.dart",
    "chars": 164,
    "preview": "void main() {\n  Future<String>.sync(() {\n    print('Função Future.sync() executada');\n    return 'Future síncrono?';\n  }"
  },
  {
    "path": "code/pt_Br/10_capitulo/11_future_microtask/main.dart",
    "chars": 119,
    "preview": "void main() {\n  Future(() => 'Future normal').then(print);\n  Future.microtask(() => 'Future microtask').then(print);\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/12_future_value/main.dart",
    "chars": 95,
    "preview": "void main() {\n  Future<int>(() => Future.value(42)).then(print);\n  print('Future.value():');\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/13_future_error/main.dart",
    "chars": 251,
    "preview": "void main() {\n  Future.error('ERRO')\n      .then(\n        (valor) => print('Não executa, o Future completa com erro..'),"
  },
  {
    "path": "code/pt_Br/10_capitulo/14_future_wait/main.dart",
    "chars": 333,
    "preview": "void main() {\n  Future.wait<String>(listaFuture()).then(print, onError: print);\n  print('Aguardando..');\n}\n\nList<Future<"
  },
  {
    "path": "code/pt_Br/10_capitulo/15_future_any/main.dart",
    "chars": 331,
    "preview": "void main() {\n  Future.any<String>(listaFuture()).then(print, onError: print);\n  print('Aguardando..');\n}\n\nList<Future<S"
  },
  {
    "path": "code/pt_Br/10_capitulo/16_async_await/main.dart",
    "chars": 112,
    "preview": "void main() {\n  final r = resposta().then(print);\n  print('Resposta: $r');\n}\n\nresposta() async {\n  return 42;\n}\n"
  },
  {
    "path": "code/pt_Br/10_capitulo/17_async_await_fluxo/main.dart",
    "chars": 225,
    "preview": "void main() {\n  final future = resposta();\n  future.then(print);\n  print('Resposta: $future');\n}\n\nFuture<int> resposta()"
  },
  {
    "path": "code/pt_Br/10_capitulo/18_async_await_x_future/main.dart",
    "chars": 572,
    "preview": "Future<String> buscarNomeUsuario() {\n  return buscarId().then((int id) {\n    return buscarNome(id);\n  }).then((String no"
  },
  {
    "path": "code/pt_Br/10_capitulo/19_async_await_erro/main.dart",
    "chars": 675,
    "preview": "void main() {\n  buscarId();\n  print('Capturando um erro assíncrono...');\n}\n\nFuture<int> buscarId() async {\n  try {\n    r"
  },
  {
    "path": "code/pt_Br/10_capitulo/20_completer_future/main.dart",
    "chars": 740,
    "preview": "import 'dart:async';\n\nclass Database {\n  void salvarUsuario(String usuario, void Function(String) callback) {\n    Timer("
  },
  {
    "path": "code/pt_Br/10_capitulo/21_completer_flexibilidade/main.dart",
    "chars": 988,
    "preview": "import 'dart:async';\nimport 'dart:math';\n\nclass CompletoComNumero {\n  late Completer<String> _completer;\n  int numero;\n\n"
  },
  {
    "path": "code/pt_Br/11_capitulo/01_dart_args/main.dart",
    "chars": 111,
    "preview": "/// Rode o programa com o código:\n/// dart main.dart teste1 2 3\nvoid main(List<String> args) {\n  print(args);\n}"
  },
  {
    "path": "code/pt_Br/11_capitulo/02_dart_http/main.dart",
    "chars": 179,
    "preview": "import 'package:http/http.dart' as http;\nvoid main(List<String> args) async {\n  http.Response response = await http.get("
  },
  {
    "path": "code/pt_Br/11_capitulo/02_dart_http/pubspec.yaml",
    "chars": 110,
    "preview": "name: livro_dart\ndescription: Dart http.\n\nenvironment:\n  sdk: '>=2.16.0 <3.0.0'\n\ndependencies:\n  http: ^0.13.4"
  },
  {
    "path": "code/pt_Br/11_capitulo/03_dart_convert/main.dart",
    "chars": 195,
    "preview": "import 'dart:convert';\n\nvoid main() {\n  final dados =\n      '{\"data\":[{ \"id\":1, \"name\":\"Acre\" }, { \"id\":2, \"name\":\"Alago"
  },
  {
    "path": "code/pt_Br/12_capitulo/01_stream_subscription/main.dart",
    "chars": 229,
    "preview": "import 'dart:async';\n\nvoid main() {\n  print('Início main()');\n  final stream = Stream<String>.value('A');\n  StreamSubscr"
  },
  {
    "path": "code/pt_Br/12_capitulo/02_stream_subscription_varios_dados/main.dart",
    "chars": 185,
    "preview": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I']);\n  final subscription = stream.listen(null);\n  subsc"
  },
  {
    "path": "code/pt_Br/12_capitulo/03_stream_subscription_callbacks/main.dart",
    "chars": 271,
    "preview": "void main() {\n  final stream = Stream.error('StreamErro');\n  final subscription = stream.listen((dado) {\n    print('Novo"
  },
  {
    "path": "code/pt_Br/12_capitulo/04_inscricao_unica_listener/main.dart",
    "chars": 217,
    "preview": "void main() async {\n  final stream = Stream.value('42');\n  final inscricaoUm = stream.listen(print);\n  /// Erro! Só é po"
  },
  {
    "path": "code/pt_Br/12_capitulo/05_broadcast_listener/main.dart",
    "chars": 193,
    "preview": "void main() async {\n  final stream = Stream.value('42').asBroadcastStream();\n  stream.listen((dado) => print('Inscrição "
  },
  {
    "path": "code/pt_Br/12_capitulo/06_stream_controller/main.dart",
    "chars": 116,
    "preview": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  Stream stream = controller.stream;\n}\n"
  },
  {
    "path": "code/pt_Br/12_capitulo/07_stream_controller_sink/main.dart",
    "chars": 348,
    "preview": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  final stream = controller.stream;\n\n  fina"
  },
  {
    "path": "code/pt_Br/12_capitulo/08_stream_consumer/main.dart",
    "chars": 328,
    "preview": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  controller.stream.listen((dado) {\n    pri"
  },
  {
    "path": "code/pt_Br/12_capitulo/09_stream_consumer_2/main.dart",
    "chars": 569,
    "preview": "import 'dart:async';\n\nvoid main() {\n  final controllerUm = StreamController();\n  controllerUm.stream.listen((dado) {\n   "
  },
  {
    "path": "code/pt_Br/12_capitulo/10_stream_sink_close/main.dart",
    "chars": 639,
    "preview": "import 'dart:async';\n\nvoid main() {\n  final controllerUm = StreamController();\n  controllerUm.stream.listen((dado) {\n   "
  },
  {
    "path": "code/pt_Br/12_capitulo/11_stream_sink_x_stream_controller/main.dart",
    "chars": 373,
    "preview": "import 'dart:async';\n\nvoid acessaSink(StreamSink sink) {\n  sink.add(42);\n  if (sink is StreamController) {\n    sink.stre"
  },
  {
    "path": "code/pt_Br/12_capitulo/12_controller_callback_inscricao_unica/main.dart",
    "chars": 1289,
    "preview": "import 'dart:async';\n\nvoid dispararEventos(StreamController controller) async {\n  for (var i = 1; i <= 6; i++) {\n    if "
  },
  {
    "path": "code/pt_Br/12_capitulo/13_controller_callback_broadcast/main.dart",
    "chars": 1642,
    "preview": "import 'dart:async';\n\nvoid dispararEventos(StreamController controller) async {\n  for (var i = 1; i <= 6; i++) {\n    if "
  },
  {
    "path": "code/pt_Br/12_capitulo/14_stream_await/main.dart",
    "chars": 405,
    "preview": "// void main() {\n//   print('início main()');\n//   final stream = Stream.fromIterable(['4', '2']);\n//   stream.listen((d"
  },
  {
    "path": "code/pt_Br/12_capitulo/15_stream_await_error/main.dart",
    "chars": 252,
    "preview": "void main() async {\n  print('início main()');\n  final stream = Stream.error(['Error']);\n  try {\n    await for (var dado "
  },
  {
    "path": "code/pt_Br/12_capitulo/16_stream_await_sem_encerramento/main.dart",
    "chars": 246,
    "preview": "import 'dart:async';\n\nvoid main() async {\n  print('início main()');\n  final controller = StreamController();\n  controlle"
  },
  {
    "path": "code/pt_Br/12_capitulo/17_stream_propriedades/main.dart",
    "chars": 396,
    "preview": "void main() {\n  final stream =\n      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();\n  stream.f"
  },
  {
    "path": "code/pt_Br/12_capitulo/18_stream_metodos_busca/main.dart",
    "chars": 580,
    "preview": "void main() {\n  final stream =\n      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();\n  stream.e"
  },
  {
    "path": "code/pt_Br/12_capitulo/19_stream_metodos_validacao/main.dart",
    "chars": 300,
    "preview": "void main() {\n  final stream =\n      Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream();\n\n  stream."
  },
  {
    "path": "code/pt_Br/12_capitulo/20_as_broadcast_stream/main.dart",
    "chars": 500,
    "preview": "import 'dart:async';\n\nvoid main() {\n  final controller = StreamController();\n  final single = controller.stream;\n  final"
  },
  {
    "path": "code/pt_Br/12_capitulo/21_distinct/main.dart",
    "chars": 162,
    "preview": "void main() {\n  final stream = Stream.fromIterable(['A', 'A', 'I', 'I', 'A', 'U']);\n  final distinctStream = stream.dist"
  },
  {
    "path": "code/pt_Br/12_capitulo/22_map/main.dart",
    "chars": 135,
    "preview": "void main() {\n  final stream = Stream.fromIterable([4, 2]);\n  final mapStream = stream.map((e) => e * 2);\n  mapStream.li"
  },
  {
    "path": "code/pt_Br/12_capitulo/23_expand/main.dart",
    "chars": 149,
    "preview": "void main() {\n  final stream = Stream.fromIterable(['A', 'E']);\n  final expandStream = stream.expand((e) => [e, e]);\n  e"
  },
  {
    "path": "code/pt_Br/12_capitulo/24_async_map/main.dart",
    "chars": 190,
    "preview": "void main() {\n  final stream = Stream.fromIterable([4, 2]);\n  final mapStream =\n      stream.asyncMap((e) => Future.dela"
  },
  {
    "path": "code/pt_Br/12_capitulo/25_async_expand/main.dart",
    "chars": 175,
    "preview": "void main() {\n  final stream = Stream.fromIterable(['A', 'E']);\n  final expandStream = stream.asyncExpand((e) => Stream."
  },
  {
    "path": "code/pt_Br/12_capitulo/26_skip/main.dart",
    "chars": 146,
    "preview": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  final skipStream = stream.skip(3);\n  sk"
  },
  {
    "path": "code/pt_Br/12_capitulo/27_skip_while/main.dart",
    "chars": 165,
    "preview": "void main() {\n  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  final skipStream = stream.skipWhile(("
  },
  {
    "path": "code/pt_Br/12_capitulo/28_take/main.dart",
    "chars": 146,
    "preview": "void main() {\n  final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']);\n  final takeStream = stream.take(3);\n  ta"
  },
  {
    "path": "code/pt_Br/12_capitulo/29_take_while/main.dart",
    "chars": 165,
    "preview": "void main() {\n  final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]);\n  final takeStream = stream.takeWhile(("
  }
]

// ... and 287 more files (download for full content)

About this extraction

This page contains the full source code of the JHBitencourt/dart-book GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 487 files (753.8 KB), approximately 278.1k tokens, and a symbol index with 1610 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!