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
================================================
- 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? vogais;
print(vogais?[1]); // > null
}
================================================
FILE: code/pt_Br/02_capitulo/25_operador_bang/main.dart
================================================
void main() {
List? 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 letrasNome(String nome, String? sobrenome) {
var letras = nome.split('');
if (sobrenome != null) {
letras.addAll(sobrenome.split(''));
}
return letras;
}
List 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 = [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 tarefas = [];
List? 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 tarefas = [];
List? 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 tarefas = [];
List? 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 tarefas = [];
List? 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 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 tarefas = [];
List? 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 tarefas = [];
List? 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 _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 tarefas = [];
void trabalhar() {
print('${this.runtimeType} trabalhando..');
}
}
class Programador extends Funcionario {
List? 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 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 tarefas = [];
void trabalhar();
}
class Programador extends Funcionario {
List? 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 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 tarefas = [];
void trabalhar();
}
class Programador extends Funcionario implements Assalariado {
Programador({this.salario = 1000});
List? 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 funcionarios;
List 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 tarefas = [];
void trabalhar();
}
class Programador extends Funcionario with Assalariado {
List? 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 funcionarios;
List 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 {
List _veiculos = [];
void entrarNaFila(T veiculo) {
_veiculos.add(veiculo);
}
}
/// Tipando FilaPedagio 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();
filaCarro.entrarNaFila(Carro());
// filaCarro.entrarNaFila(Caminhao()); // Erro
final filaCaminhao = FilaPedagio();
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 {
List _veiculos = [];
void entrarNaFila(T veiculo) {
_veiculos.add(veiculo);
}
}
class Bicicleta {}
/// Restringindo os tipos aceitos em FilaPedagio para apenas subclasses de
/// VeiculoAutomotor, estamos impedindo que veículos como Bicicleta entrem na
/// fila de pedágio.
void main() {
final filaCarro = FilaPedagio();
final filaCaminhao = FilaPedagio();
// final filaBicicleta = FilaPedagio(); //Erro
}
================================================
FILE: code/pt_Br/09_capitulo/05_generics_metodos/main.dart
================================================
T ultimo(List itens) {
T ultimo = itens.last;
return ultimo;
}
void main() {
print(ultimo([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 = [];
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.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 = ['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();
megasena.addAll([44, 35, 4, 11, 29, 4, 35, 57]);
print(megasena); // > {44, 35, 4, 11, 29, 57}
final vogais = {'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();
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();
megasena.addAll(['44', '35', '4', '11', '4']);
print(megasena); // > {11, 35, 4, 44}
final megasena2 = SplayTreeSet((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();
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();
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
print(usuario['Nome']!.runtimeType); // > String
print(usuario['Sobrenome']?.runtimeType); // > null
Iterable chaves = clientes.keys;
Iterable valores = clientes.values;
Iterable 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.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(() {
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 buscarId() {
return Future.delayed(const Duration(seconds: 3), () => 1);
}
Future buscarNome(int id) {
return Future.delayed(const Duration(seconds: 3), () => 'JHBitencourt');
}
================================================
FILE: code/pt_Br/10_capitulo/06_erro_cadeia_assincrona/main.dart
================================================
Future um() => Future.value('Primeiro');
Future dois() => Future.error('Erro no dois()');
Future 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 um() => Future.value('Primeiro');
Future dois() => Future.error('Erro no dois()');
Future 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 um() => Future.value('Primeiro');
Future dois() => Future.error('Erro no dois()');
Future 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 um() => Future.value('Primeiro');
Future dois() => Future.error('Erro no dois()');
Future 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.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(() => 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(listaFuture()).then(print, onError: print);
print('Aguardando..');
}
List> listaFuture() => [2, 1, 3]
.map((s) => Future.delayed(Duration(seconds: s), () => 'Tempo: $s'))
.toList();
Future comErro() => Future.error('Erro ao buscar dados.');
================================================
FILE: code/pt_Br/10_capitulo/15_future_any/main.dart
================================================
void main() {
Future.any(listaFuture()).then(print, onError: print);
print('Aguardando..');
}
List> listaFuture() => [2, 1, 5]
.map((s) => Future.delayed(Duration(seconds: s), () => 'Tempo: $s'))
.toList();
Future comErro() => Future.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 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 buscarNomeUsuario() {
return buscarId().then((int id) {
return buscarNome(id);
}).then((String nome) {
return 'Usuário: $nome';
});
}
Future 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 buscarId() async => 42;
Future 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 buscarId() async {
try {
return await Future(() {
return 42 ~/ 0;
});
} on UnsupportedError catch (e) {
print('Erro capturado: $e');
} catch (e) {
print('Demais erros caem aqui');
}
return 0;
}
// Future buscarId() async {
// return Future(() {
// 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 salvarUsuario(String usuario) {
final completer = Completer();
Database().salvarUsuario(usuario, (String resultado) {
completer.complete(resultado);
});
return completer.future;
}
}
Future 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 _completer;
int numero;
CompletoComNumero._internal(this.numero) {
_completer = Completer();
sorteio().listen(_validarNumero);
}
Stream sorteio() async* {
for (int i = 0; i < 5; i++) {
if (_completer.isCompleted) break;
await Future.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 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 args) {
print(args);
}
================================================
FILE: code/pt_Br/11_capitulo/02_dart_http/main.dart
================================================
import 'package:http/http.dart' as http;
void main(List 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 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.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? controller;
controller = StreamController(
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 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? controller;
controller = StreamController.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 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();
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 {
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 _controller;
late StreamSubscription _subscription;
late Stream _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 bind(Stream stream) {
_streamEntrada = stream;
return _controller.stream;
}
@override
StreamTransformer cast() => 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 criarTransformer({
String sufixo = '',
String prefixo = '',
}) {
return StreamTransformer(
(Stream streamEntrada, bool cancelOnError) {
late StreamController controller;
late StreamSubscription subscription;
controller = StreamController(
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 {
AlfabetoTransformer({
String sufixo = '',
String prefixo = '',
}) : _transformer = criarTransformer(sufixo, prefixo);
final StreamTransformer _transformer;
@override
Stream bind(Stream stream) => _transformer.bind(stream);
static StreamTransformer criarTransformer(
String sufixo, String prefixo) {
return StreamTransformer(
(Stream inputStream, bool cancelOnError) {
late StreamController controller;
late StreamSubscription subscription;
controller = StreamController(
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 criarTransformer({
String sufixo = '',
String prefixo = '',
}) {
return StreamTransformer.fromHandlers(
handleData: (String dado, EventSink 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 sink) {
sink.addError('Erro stream');
}, handleDone: (EventSink sink) {
sink.add('Stream finalizada');
});
}
void main() {
StreamController? controller;
controller = StreamController(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 {
AlfabetoTransformer({
String sufixo = '',
String prefixo = '',
}) : _transformer = criarTransformer(sufixo, prefixo);
final StreamTransformer _transformer;
@override
Stream bind(Stream stream) => _transformer.bind(stream);
static StreamTransformer criarTransformer(
String sufixo, String prefixo) {
return StreamTransformer(
(Stream inputStream, bool cancelOnError) {
late StreamController controller;
late StreamSubscription subscription;
controller = StreamController(
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 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 get streamNumeros {
final controller = StreamController();
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 get streamNumeros {
final controller = StreamController.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 get streamNumeros {
final controller = StreamController.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 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 letrasNumeros() sync* {
for (int i = 1; i < 3; i++) yield i;
yield* letras();
}
Iterable 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 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 letrasNumeros() async* {
yield* letras();
for (int i = 1; i < 3; i++) yield i;
}
Stream 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 isolateBidirecional(
ReceivePort receivePort, void onMessage(var message)) async {
final completer = Completer();
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 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 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 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 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 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 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 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 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 main() async {
final file = File('teste.txt');
Stream> streamBytes = file.openRead();
Stream 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 {
BidirectionalIteratorList(Iterable iterable, {bool back = false})
: _iterable = iterable,
_length = iterable.length,
_index = back ? iterable.length - 1 : 0;
final Iterable _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({required this.nome, required this.salario});
String nome;
double salario = 0.0;
List tarefas = [];
List? 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 divisores(int numero) async* {
for (int i = 1; i <= numero; i++) {
if (numero % i == 0) yield i;
}
}
Future 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 numerosImpar() async* {
for (int i = 0; i < 1000; i++) {
if (i % 2 != 0) yield i;
}
}
Future 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 transformerEmail() {
return StreamTransformer.fromHandlers(
handleData: (String dado, EventSink 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 sink) {
sink.addError('Erro stream');
}, handleDone: (EventSink sink) {
sink.add('Stream finalizada');
});
}
void main() {
StreamController? controller;
controller = StreamController(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 transformerTelefone() {
return StreamTransformer.fromHandlers(
handleData: (String dado, EventSink 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 sink) {
sink.addError('Erro stream');
}, handleDone: (EventSink sink) {
sink.add('Stream finalizada');
});
}
void main() {
StreamController? controller;
controller = StreamController(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(' 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(' 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 args) {
runZonedGuarded(() {
executar(args);
}, (e, s) {
print(e);
print(s);
salvarErro(e, s);
});
}
Future executar(List 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 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 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> 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 = [];
responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));
return cidades;
}
Future 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 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 _validarDiretorio({String? dirPath}) async {
final dir = Directory(dirPath ?? 'log');
if (!(await dir.exists())) {
await dir.create(recursive: true);
}
}
Future salvarTempoIsolate(ClimaTempo climaTempo) async {
final isolate = await Isolate.spawn(salvarTempo, climaTempo);
_registrarCallbackFinalizacao(isolate);
}
Future 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 salvarCidadesIsolate(List cidades) async {
final isolate = await Isolate.spawn(salvarCidades, cidades);
_registrarCallbackFinalizacao(isolate);
}
Future salvarCidades(List 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 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 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 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 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. (package:climatempo/log.dart:24:5)
#1 salvarTempo. (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. (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. (dart:io/file_impl.dart:356:9)
#1 _rootRunUnary (dart:async/zone.dart:1434:47)
#2 _CustomZone.runUnary (dart:async/zone.dart:1335:19)
#3 salvarTempo. (package:climatempo/log.dart:25:5)
================================================
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 args) {
runZonedGuarded(() {
executar(args);
}, (e, s) {
print(e);
print(s);
salvarErro(e, s);
});
}
Future executar(List 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 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 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> 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 = [];
responseJson.forEach((map) => cidades.add(Cidade.fromJson(map)));
return cidades;
}
Future 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 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 _validarDiretorio() async {
final dir = Directory('log');
if (!(await dir.exists())) {
await dir.create();
}
}
Future salvarTempoIsolate(ClimaTempo climaTempo) async {
final receivePortError = ReceivePort();
receivePortError.listen((error) {
final errorList = error as List;
salvarErro(
errorList.first,
StackTrace.fromString(errorList[1]),
fileName: 'io.txt',
);
});
final isolate = await Isolate.spawn(
salvarTempo,
climaTempo,
onError: receivePortError.sendPort,
);
_registrarCallbackFinalizacao(isolate);
}
Future 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 salvarCidadesIsolate(List cidades) async {
final receivePortError = ReceivePort();
receivePortError.listen((error) {
final errorList = error as List;
salvarErro(
errorList.first,
StackTrace.fromString(errorList[1]),
fileName: 'io.txt',
);
});
final isolate = await Isolate.spawn(
salvarCidades,
cidades,
onError: receivePortError.sendPort,
);
_registrarCallbackFinalizacao(isolate);
}
Future salvarCidades(List 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 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 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