Creates the app skeleton and the seam everything else in the project hangs off: region-specific data lives in an asset file, not in code, so adding a region later is a new JSON file rather than a refactor. Notable choices: - applicationId and namespace are it.nuvolari.app rather than the doubled it.nuvolari.nuvolari that `flutter create` produces, with the Kotlin package and the iOS bundle identifiers moved to match. - SDK levels are pinned instead of inherited from `flutter.*`. Google Play requires API 36, and that is a release blocker rather than something to let a Flutter upgrade change silently. minSdk 24 is the highest floor the planned dependencies impose. - Riverpod and Dio-free for now, no code generation: see docs/stack-decisions.md. - Italian is the l10n source language, so app_it.arb is the template rather than a translation of an English original. The region parser rejects rather than repairs. An inverted bounding box, a map centre outside its own bounds, an unknown adapter name, a duplicate zone code or an empty attribution list all throw with the offending field named. Each of those would otherwise fail silently and visibly wrong: a swapped latitude and longitude renders the radar in the wrong place, an unknown adapter falling back to mock would show demo frames where live data was expected, and a missing attribution is a licence violation rather than a cosmetic gap. Tests run against the asset that actually ships and against a captured copy of the live ARPA CAP feed, so the eleven zone codes in the config are checked against the eleven the feed really emits rather than against a list retyped from documentation. Verified: dart format clean, flutter analyze 0 issues, 50 tests passing, flutter build appbundle --debug produces an AAB with applicationId it.nuvolari.app, minSdk 24, targetSdk 36. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
49 lines
1.2 KiB
YAML
49 lines
1.2 KiB
YAML
include: package:flutter_lints/flutter.yaml
|
|
|
|
analyzer:
|
|
exclude:
|
|
- build/**
|
|
- android/**
|
|
- ios/**
|
|
# Generated from lib/l10n/*.arb by the Flutter tool.
|
|
- lib/l10n/app_localizations*.dart
|
|
|
|
errors:
|
|
# UI text must come from the ARB files. A literal string reaching a widget
|
|
# is untranslatable, so treat it as an error rather than a hint.
|
|
prefer_const_constructors: warning
|
|
todo: ignore
|
|
|
|
language:
|
|
strict-casts: true
|
|
strict-inference: true
|
|
strict-raw-types: true
|
|
|
|
linter:
|
|
rules:
|
|
# Correctness
|
|
- always_declare_return_types
|
|
- avoid_dynamic_calls
|
|
- avoid_slow_async_io
|
|
- cancel_subscriptions
|
|
- close_sinks
|
|
- comment_references
|
|
- literal_only_boolean_expressions
|
|
- no_adjacent_strings_in_list
|
|
- test_types_in_equals
|
|
- throw_in_finally
|
|
- unnecessary_statements
|
|
|
|
# Async correctness — the radar timeline is full of races between
|
|
# prefetching, scrubbing and lifecycle changes.
|
|
- discarded_futures
|
|
- unawaited_futures
|
|
|
|
# Style consistency
|
|
- directives_ordering
|
|
- prefer_final_locals
|
|
- prefer_single_quotes
|
|
- sort_child_properties_last
|
|
- unnecessary_parenthesis
|
|
- use_string_buffers
|