App vom Evangelischen Jugendwerk Esslingen. Entwickelt mit Flutter als ehrenamtliches Nebenprojekt. Diese app startete parallel zu meiner Kartenspiele App und wurde Anfangs in Android geschrieben. Da die App aber auch für IOS veröffentlicht werden soll, wurde die App komplett in Flutter neu geschrieben. Diese App ruft Daten von einer REST-API ab, und benutzt einen Webscraper, um relevatnen Daten von der Website zu holen, für welche es keine saubere API gibt. Die App wurde über mehrere Jahre schubweise entwickelt, daher ist die Code-base nicht an allen Stellen konsistent.
Die README dient primär der eigenen Dokumentation.
Die Architektur ist in 3 primäre Ebenen aufgeteilt: Data, Domain und Presentation.
In Data gibt es 2 Datasources, eine Remote die Daten aus dem Internet holt und eine lokale Datenbank, die diese cached un für den Offline-Betrieb bereitstellt. Diese 2 Datasources werden von repositories vereint und stellt die Schnittstelle zwischen Daten- und Domainebene dar.
In der Domainebene werden die Daten aus dem Backend in den Repositories als Entitäten bereitgestellt. Über die Use-Cases können die Entitäten für verschiedene Anwendungsfälle aufgerufen werden.
In der Presentationebene wird das Statemanagment betrieben, die Logik für das Frontend behandelt und die Widgets gerendert. Diese Ebene stellt das typische Frontend dar
Error
- exeption als Models für die verschiedene Arten von Fehlern im Data/Domain-Layer
- failure als Models für die verschiedene Arten von Operationsfehlschlägen im Data/Domain-Layer
Platform
- Reminder als Entität für das Speichern von Erinnerungen für push-notifications (Termine)
- network_info als Methode zum herausfinden ob die App Verbindung zum Internet hat
Usecases
- usecases als Template für usecases für die Architektur
Utils
- first_startup um beim aller ersten starten der AppStandardwerte zu setzen
- injection_container für Dependency Injection, um die losen Module der Architektur zu verbinden
- WebScraper um Artikel von der Homepage webzuscrapen (breiter angelegte Online-Datenquelle)
Widgets
- bloc für Statemanagment auf der obersten Ebene
- Loadingindicator als universelle Ladeanmiation
- DetailsPage für die Darstellung einzelner Seiten der Website oder Detaileinzeige einer page aus der App
- Hyperlinksectiom für die Darstellung und das öffnen von Hyperlinks in DetailsPage
- Prefimage als Widget für die darstellung von network images, die je nach Einstellung aus dem cache oder jedes mal aus den Internet geladen werden
Die Pages enthalten die einzelnen Menüpunkte und haben alle denselben Aufbau. Daher werden nur die einzelnen Menüpunkte un der generelle Aufbau gelistet
Pages
- Articles: Bildet den Inhalt einer Seite der Homepage ab auf DetailsPage
- Einstellungen: Appeinstellungen und rechtliche Angaben wie Datenschutz und Lizenzen
- eje: Vorstellung der Arbeitsbereiche, des BAK/Vorstandes, der Hauptamtlichen und ausgewählten Services
- freizeiten: Auflistung der Freizeiten, die im ejw-Manager öffentlich gelistet sind
- instagram: Anzeigen der Website des eje-Instagrams, wird im Release nicht übernommen
- neuigkeiten: Auflistung der neuesten news des eje
- termine: Auflistung der Veranstaltungen des ejw-managers, die dort öffentlich gelistet werden
Generelle Aufbau
- data: Wird aufgeteilt in Local-Datasource (Cache mithilfe von Hive) und Remote-Datasource(RSS-Feed, API des ejw-Managers oder WebScraping) und repository für die Zusammenführung
- domain: Entities, die die Daten darstellen inklusive einer Error-Entity mit Minimaldaten, repositories die Entitäten generieren und verschiedene usecases um verschiedene Entitäten anzufragen (meistens eine Liste von Entitäten oder eine einzelne Entität)
- presentation: Bloc für Statemanagment. Innerhalb von Bloc gibt es Bloc_Events für verschiedene Events, die ein State-wechsel verursachen, Bloc-STates für die verschiedene zustände der WIdgets und BLoc selber als Buisness Logic, welche festlegt welche Events welche States hervorrufen. Widgets sind frontend widgets für die Darstellung zuständig (UI)
- außerhalb der packages ist immer ein übergeordnetes Widgets, was das oberstes WIdgets eines Menüpunktes darstellt und die verschiedenen unterwidgets eines Menüpunktes zusammenführt
- Hive und Path Provider (Depenmdency von Hive) als Offline-Database
- Webfeed zum parsen der RSS-Feeds, über die Daten der ListViews der Homepage des eje bezogen werden
- HTML für WebScraping, über das Daten einzelner Seiten der Homepage bezogen werden
- Bloc für State-Managment
- Equatable und Dartz als Tools für die Architektur
- Data Connection Checker, connectivity und http für online-API-Aufrufe
- Get it für Dependency Injection
- Flutter Local Notifications für Push-Benachrichtigungen
- Android Alarm Manager für Android Background Services
- Bkground Fetch für IOS Bkground Services
- Persistent Bottom Nav Bar als Widget für die Navigation
- Material Design Icons und Icon Shadow für Icons
- WebView und URL-Launcher für das Anzeigen von Websiten
- Pageview-Indicators für Indicator-Punkte bei Pageviewer (größtenteils swipebare Bilder)
- Flutter-Swiper für Card-Swipe-Views (Widget im Frontend)
- Cached Network Image zum cachen von Bildern