Lagenstructuur
Zie het lagendiagram voor het totaalplaatje; dit hoofdstuk beschrijft de conventies per laag.
Pages — lib/pages/
Widgets op schermniveau, één per route, geannoteerd met @RoutePage(). Routeparameters komen binnen via @PathParam-/@QueryParam-annotaties op de constructor; de actuele servernaam propageert de routeboom in via @PathParam.inherit('serverName'). Pages halen data op met de Query-widget uit graphql_flutter en delegeren alles wat stateful of schermoverstijgend is aan de services.
Een page toevoegen betekent: de @RoutePage()-klasse schrijven, hem opnemen in lib/routes/AppRouter.dart, en dart run build_runner build draaien (zie hoofdstuk 5).
Components — lib/components/
Herbruikbare widgets, zonder kennis van de navigatieboom. De belangrijkste:
IsterPlayer— omhult demedia_kit-videowidget.CarouselItemView— de gedeelde tegel voor series/films/albums; met optioneelplaceholderIconvoor items zonder artwork. Elk albumhoesoppervlak valt terug op een muzieknoot-placeholder en gebruikterrorBuilderopCachedNetworkImage(decached_network_image_ce-fork —errorWidgetis daar deprecated).RecentCarouselView— abonneert zich opPlayQueueService-streams voor live voortgangsupdates.PlayerView— de fullscreen speler-UI die de muziekspeler en de party-modus-remote delen (zie hoofdstuk 2).TvFocusable— omhult aantikbare widgets voor Android TV: voegt de focus node toe, koppelt select/enter aanonTap, en tekent de highlight alleen tijdens directionele navigatie. Gebruik dit in plaats van lay-outvertakkingen opPlatformService.isAndroidTv.- Gepagineerde lijsten (
PagedContentView,TvShowSlide,TvShowScroll) — zie het paginapatroon in hoofdstuk 5.
Services — lib/utils/
Singleton-bedrijfslogica: serverdiscovery, auth, GraphQL-clients, afspelen, instellingen, zoeken, en de interne delen van de epub-lezer (lib/utils/epub/) en striplezer (lib/utils/comic/). Elke service staat beschreven in hoofdstuk 3. Services houden maps per server bij — elke aanroep krijgt een serveridentifier mee.
GraphQL — lib/graphql/
Handgeschreven .graphql-documenten naast hun gegenereerde .graphql.dart-tegenhangers, plus het schema in lib/graphql/schema.graphql. graphql_codegen produceert Query$naam-, Mutation$naam- en Fragment$naam-klassen. Bewerk gegenereerde bestanden nooit; bewaak de vele nullable schemavelden. Details in hoofdstuk 5.
DTO's — lib/dto/
Kleine typen die playback en de audio-service-browse-tree delen:
IsterMediaItem— omhult een aflevering, film of track achter één interface.MediaItemId— codeertserverName;type;idin deaudio_serviceMediaItem.id-string, zodat een media-item altijd naar zijn server te herleiden is.IsterMediaService— media-lookups voor de Android Auto-browse-tree.