Context & High-Stakes Constraints
In the modern mobile landscape, users demand lightning-fast access to breaking news without sluggish web views, cluttered advertising, or clunky navigation. News App was designed and developed as a sleek, modern mobile application delivering real-time journalistic feeds from CNN Indonesia directly into a streamlined, native interface.
The primary architectural objectives were zero-latency navigation, instantaneous full-text search, multi-category channel organization, date-based archival filtering, offline bookmark curation, and dynamic visual theming tailored for both daytime reading and nighttime environments.
The News App Experience in Action
Explore the high-velocity mobile reading experience — featuring live CNN Indonesia news streams, multi-category chips, full-text substring search, ISO-8601 calendar filtering, expandable sliver article reader, and reactive bookmark curation.
Official News Reader Showcase & Device Suite
Comprehensive presentation showcase highlighting the News App mobile architecture, displaying real-time journalism feeds, immersive editorial article reading views, and personalized bookmark management across modern iOS and Android displays.
Core Architectural Capabilities
A breakdown of the engineering building blocks powering News App's high-throughput news delivery, reactive UI updates, and offline bookmarking.
REST API Live Stream Ingestion
Direct asynchronous HTTP client consuming CNN Indonesia news data from https://berita-indo-api.vercel.app/v1/cnn-news/ with dynamic endpoint parameter routing, robust status code validation, and resilient JSON map parsing.
GetX Reactive Architecture & State Management
Clean separation of presentation and business logic utilizing NewsController extending GetxController, observable variables (.obs) for allNews, filteredNews, bookMarks, and isLoading, wrapped in surgical Obx widget rebuilders.
Multi-Faceted Search & Calendar Date Filtering
Real-time search listener tracking user input to perform case-insensitive headline substring matching combined with native showDatePicker calendar selection comparing ISO-8601 year, month, and day.
Immersive Editorial UI & Dynamic Theming
Material Design 3 visual language featuring CustomScrollView with flexible SliverAppBar hero headers, category pills, reading duration badges, dynamic dark/light theme switching, and Lottie vector splash screen.
6 Mission-Critical Modules
Each module is engineered with robust transactional boundaries, modular isolation, and comprehensive audit trails.
Dynamic Category Routing & RESTful Ingestion
Direct asynchronous HTTP client querying remote CNN Indonesia endpoints with dynamic category path suffixes and JSON decoding.
- HTTP Client Pipeline: Api.getApi() uses package:http/http.dart to query https://berita-indo-api.vercel.app/v1/cnn-news/ asynchronously.
- 8 Dynamic Channels: Supports seamless path switching across nasional, internasional, ekonomi, olahraga, teknologi, hiburan, and gaya-hidup.
- JSON Deserialization: Maps raw API response payloads into structured List<Map<String, dynamic>> records with title, link, snippet, and images.
- Network Fault Tolerance: Traps non-200 HTTP codes and throws descriptive exceptions caught by the reactive controller layer.
Content Ingestion & Reader Lifecycle
From CNN Indonesia REST API stream through GetX reactive transformation to reader bookmarking — every article flows through a resilient, responsive pipeline.
API Query & Endpoint Handshake
Api.getApi() queries remote CNN endpoints with category path suffixes, validating HTTP 200 status codes.
Payload Parsing & Normalization
Decodes raw JSON body into structured Map<String, dynamic> records containing title, link, snippet, and multi-res images.
Observable State Synchronization
NewsController populates allNews.obs and filteredNews.obs, triggering immediate Obx DOM repaints.
Substring Search & ISO Date Filtering
_applyFilters() evaluates active keystrokes and calendar date selections against in-memory article collections.
Sliver Reader & Content Delivery
DetailScreen renders rich typography, hero imagery, category badges, and localized Indonesian timestamps.
De-Duplicated Favorite Persistence
Users tap the bookmark action to atomically add or remove articles with positive snackbar confirmations.
Non-Volatile Bookmark De-Duplication & State Isolation
All bookmark operations perform title-based equality checks before mutating the observable RxList. This guarantees zero duplicate bookmarks, isolated state boundaries, and instant rollback on removal.
Application Architecture & Data Flow
Layered system design decoupling network transport, reactive state control, and responsive UI components.
Presentation Layer (Flutter 3.x)
Dart ^3.8.1 + Material 3Reactive screens (ApiScreen, DetailScreen, FavoriteScreen, SplashScreen) bound to GetX controllers via granular Obx builders.
Reactive State & Logic (lib/controller/)
GetxController + ObservablesNewsController and SplashController managing observables (.obs), search listeners, date filters, themes, and bookmark rosters.
Service & Ingestion Layer (lib/api/)
HTTP 1.5.0 + dart:convertApi class managing remote network communication with CNN Indonesia REST endpoints with robust status code validation.
Routing & Notification Engine
GetMaterialApp + Route ManagerDeclarative navigation (Get.to, Get.off) and context-free UI notifications via Get.snackbar without requiring BuildContext.
Localization & Date Engine
intl 0.20.2 (id_ID)Indonesian locale formatting using initializeDateFormatting('id_ID', null) for native date and timestamp representations.
Vector Animation Engine
Lottie 3.1.2 + After Effects JSONHardware-accelerated vector animation runtime executing Insider-loading.json at silky 60 FPS during startup.
Curated Technology Stack
A modern engineering stack combining high-throughput user interfaces, modular backend architecture, and resilient data layers.
Mobile Application & UI
State Management & Architecture
Networking & Ingestion
Localization & Media Engine
Codebase Structure & Data Models
Clear boundary separation between system components, paired with modular schemas and structured repositories.
Database Entities & Schema Models
Data Model: NewsArticle Record
Structured Dart representation of news items: title (string), link (string), contentSnippet (string), isoDate (string), and image object with small/large URLs.
REST API Endpoint: /v1/cnn-news/{category}
GET endpoint returning syndication envelope with status, total count, and array of category-specific CNN articles.
Reactive Store: NewsController State
GetxController reactive store holding allNews.obs, filteredNews.obs, bookMarks.obs, isLoading.obs, isTheme.obs, and selectedDate.
API Reliability & Client-Side Resiliency
Enterprise architectural safeguards ensuring uninterrupted news reading and robust error handling.
API Endpoints & Routing Architecture
Remote CNN News Ingestion
Client-Side Reactive Filtering
Enterprise Security & Governance Standards
Graceful Network Intercept & User Snackbars
Surrounds API HTTP calls with try-catch blocks; automatically resets loading indicators, displays non-blocking Get.snackbar error notifications, and provides fallback empty list states.
CDN Image Fallback & Placeholder Containment
All Image.network widgets implement custom errorBuilder fallbacks rendering neutral grey placeholder containers with Icons.image_not_supported to prevent layout crashes on dead image URLs.
Null-Safe Type Boundaries & ISO Timestamp Parsing
Enforces strict Dart 3.8 null-safety across all dynamic JSON maps, using safe navigation operators and try-parse handlers for ISO-8601 timestamps and nested image URL properties.
Non-Volatile Bookmark State De-Duplication
Employs any() predicate validation on article titles before appending to bookMarks.obs, preventing accidental duplicate saves and providing immediate visual feedback.
Engineering Challenges & Production Results
How critical technical bottlenecks were overcome and verified under real production conditions.
Challenge // 01
Coordinating multi-predicate filtering across search text and calendar dates simultaneously. Solved by architecting an atomic _applyFilters() method that sequentially evaluates both active calendar dates against parsed ISO-8601 strings and lowercase headline substring queries against the in-memory master collection.
Challenge // 02
Handling remote CDN image load failures and dead thumbnail links gracefully. Solved by implementing robust errorBuilder callbacks across all Image.network instances, gracefully substituting missing media with styled placeholder widgets and preventing layout shifts.
Challenge // 03
Delivering fluid UI transitions between bright daytime reading and dark night mode. Solved by building a dynamic Get.changeTheme() mechanism that toggles between ThemeData.dark() and a tailored light theme with zero-elevation app bars.
