$ show ComicSparks/pikapika
Pikapika is a cross-platform comic reader and downloader built with Flutter and Go, providing an ad-free experience for reading manga and comics. The application supports Windows, macOS, Linux, Android, and iOS, offering features such as browsing comics by category, searching, reading online or offline, managing downloads, favoriting content, viewing and posting comments, and downloading games. It includes a pro tier that unlocks advanced features like batch operations and extended export capabilities. The architecture separates the Flutter-based UI from a Go-based core backend, communicating via MethodChannels on mobile and go-flutter plugins on desktop. Local data storage for settings, favorites, and download history is managed through a central Method service. The UI is composed of reusable widgets organized in a component library, including specialized widgets for displaying comics, handling asynchronous states, and managing user interactions. Settings are implemented as individual classes that persist user preferences and broadcast changes via an event bus. Key entry points include platform-specific native code (MainActivity for Android, AppDelegate for iOS, etc.) and Flutter's main.dart/main_desktop.dart. Data flows involve user interactions triggering API requests through the Method service, which communicates with the Go backend to fetch or process data, then updates the UI accordingly. The application relies on various Flutter plugins for permissions, file handling, networking, and UI enhancements, while the Go core handles core logic and API interactions. We note that the project is actively maintained with recent commits and a low level of technical drift, indicating ongoing compatibility with current dependencies and platform SDKs.
The LLM identified 4 files worth highlighting for reuse:
A reusable widget for displaying context menus (right-click on desktop, long-press on mobile). It uses an event bus to detect clicks outside the menu for auto-dismissal, demonstrating a decoupled approach to handling user interactions without tight coupling to specific UI states.
A flexible avatar image widget that loads images from network, asset, or file sources with customizable radius and placeholder support. It encapsulates common image loading logic with fallback handling, making it easily adaptable to various UI contexts without project-specific dependencies.
An image loading widget that supports multiple sources (network, asset, file) with caching, placeholder, and error handling capabilities. It provides a consistent interface for displaying images across the application, reducing boilerplate in UI components.
A generic widget for managing asynchronous UI states (loading, error, content) based on a Future. It simplifies handling of data-fetching UI by encapsulating the common pattern of showing loading indicators, error messages, or content upon completion, promoting consistency and reducing repetitive code.