guozhigq/flutter_v2ex
57.3
Adequate · 19 September 2026
19.7k
lines of production code
Dart
primary language
1
measurement over time
What this system is
This system is a cross-platform Flutter client for the V2EX community, supporting Android, iOS, Linux, macOS, Windows, and Web. It enables users to browse topics and nodes, manage user profiles, and interact with content through replies, favorites, and notifications. The application features adaptive layouts, rich text rendering, and local caching for offline access, while handling authentication and deep linking across all supported platforms.
How it got here
2022 — Initial multi-platform scaffolding
11 changes.
This period established the foundational structure for the VVEX Flutter client, initializing the project with standard configuration, linting, and documentation. It added native platform support for Android, iOS, Linux, macOS, Windows, and Web, enabling the application to run across all major desktop and mobile environments. Core features such as dynamic theming, internationalization, and global font scaling were integrated into the initial app shell.
2023–2025 — comprehensive app rewrite
23 changes.
The project underwent a complete architectural and UI overhaul, replacing the previous implementation with a modular, Dio-based HTTP layer and a GetX-driven routing system. This period focused on rebuilding core features such as topic browsing, user profiles, and search with adaptive layouts, while establishing robust local caching and state management infrastructure.
Features
Add Today's Hot topics page
A new 'Today's Hot' page has been added to the application, displaying a list of trending topics fetched from the server. The view includes a pull-to-refresh mechanism to reload the latest hot topics and provides a link to a historical hot topics view via a 'History' button in the app bar on smaller screens. The page utilizes an adaptive layout to adjust the display for different screen sizes.
lib/pages/hot · high confidence
Add markdown editor and XPath parsing packages
The lib/package area now includes two new libraries: a Markdown editor component (MarkdownTextInput) that allows users to format text with bold, italic, links, lists, and other styles, and an XPath parsing library (ETree) for querying HTML/XML structures. These additions provide new capabilities for content editing and data extraction within the application.
lib/package · high confidence
Add member profile list item components
New UI components have been added to the member section to display user activity: ReplyItem renders individual replies with HTML content, timestamps, member IDs, and node names, while TopicItem displays topic titles, reply counts, and associated node tags. Placeholder components (ReplyItemBlank and TopicItemBlank) are also included for empty states.
lib/components/member · high confidence
Add notice item component with swipe-to-delete and floor navigation
A new \NoticeItem\ widget has been added to the message components, enabling users to view notification details including HTML-rendered topic titles and reply content. The component supports swiping left to delete a notice via the \onDeleteNotice\ callback and allows tapping to navigate to the specific topic floor (reply) associated with the notification, passing the floor number as a parameter for deep-linking.
lib/components/message · high confidence
Added 'My Follow' and 'My Topics' pages to the user profile section
The 'My' section now includes dedicated views for followed topics and favorited topics. Users can view their followed topics in the new My Follow page and their favorited topics in the My Topics page, both featuring pull-to-refresh, pagination, and a scroll-to-top button.
lib/pages/my · high confidence
Added HTML/CSS prototype for the application icon
A new HTML file has been added to the assets/images/icon directory that defines the visual structure and styling of the app icon using CSS shapes. This file serves as a design prototype or source representation for the icon, featuring two rotated rounded rectangles with specific colors (\#5CCFFF and \#125C9C) and shadows, rather than a raster image file itself.
assets/images/icon · high confidence
Added Node detail page for browsing topics by node ID
Introduced a new GoPage that displays a list of topics associated with a specific node ID passed via route parameters. The page supports pull-to-refresh and infinite scroll pagination, includes a floating action button to scroll to the top, and provides error handling with a retry option. It also allows users to favorite/unfavorite the current node.
lib/pages/go · high confidence
Added macOS Flutter plugin registration and build configuration
This change introduces the initial macOS support for the Flutter application by adding the necessary build configuration files (Flutter-Debug.xcconfig and Flutter-Release.xcconfig) and the auto-generated plugin registrant (GeneratedPluginRegistrant.swift). The registrant explicitly registers a suite of plugins including device\_info\_plus, dynamic\_color, flutter\_inappwebview\_macos, flutter\_local\_notifications, package\_info\_plus, path\_provider\_foundation, photo\_manager, share\_plus, sqflite\_darwin, url\_launcher\_macos, video\_player\_avfoundation, and webview\_flutter\_wkwebview, enabling these capabilities on the macOS platform.
macos/Flutter · high confidence
Added macOS project configuration for Flutter app
The macOS build configuration for the 'Runner' target has been added, establishing the Xcode project structure required to build the Flutter application. This includes the main project file defining the 'flutter\_v2ex.app' target, workspace settings that integrate CocoaPods dependencies, and the Xcode scheme configured for building, testing, and launching the app.
macos/Runner.xcodeproj · high confidence
Initial Android project setup and configuration
The Android module has been initialized with the package name com.guozhigq.vvex and the application label VVEX. The configuration enables deep linking for V2EX topic URLs (https://\.v2ex.com/t/.\), activates the onBackInvokedCallback for standard Android back-gesture support, and declares necessary permissions for internet access, media storage, notifications, and foreground services. The build environment is configured to use Gradle 8.11.1, and the app includes standard launch themes and an adaptive icon.
android · high confidence
Initial Linux desktop platform support added
This change adds the foundational Linux build configuration and native entry points for the Flutter application. It introduces the CMake build scripts (CMakeLists.txt) required to compile the Linux target, sets up the GTK-based application window with appropriate header bar logic for GNOME and other desktop environments, and registers the \dynamic\_color\ and \url\_launcher\_linux\ plugins for use on Linux. Users can now build and run the application on Linux desktops.
linux · high confidence
Initial Windows desktop platform support
The application now includes the necessary build configuration and native runner code to run on Windows. This adds a CMake-based build system, a Win32 window host with high-DPI awareness, and the registration of core plugins (dynamic\_color, flutter\_inappwebview\_windows, permission\_handler\_windows, share\_plus, and url\_launcher\_windows) so that existing mobile features are available on the desktop.
windows · high confidence
Initial app launch with dynamic theming and global font scaling
The application now initializes with support for Android edge-to-edge display and dynamic color schemes (Material You), falling back to a brand color if dynamic colors are unavailable. It introduces a global font size setting that scales text independently of system preferences, and integrates internationalization with Chinese and English locale support.
lib · high confidence
Initial iOS project scaffolding for VVEX
The iOS directory has been initialized with a standard Flutter project structure, establishing the native Xcode workspace and build configuration. This includes the \Runner\ target, asset catalogs for the app icon and launch screen, and the \Info.plist\ which sets the application display name to 'VVEX' and declares permissions for camera, photo library, microphone, contacts, location, and other device features. The \AppDelegate\ is configured to support local notifications via \flutter\_local\_notifications\, and the project enforces a minimum deployment target of iOS 12.0.
ios · high confidence
Initial macOS platform support added
The macOS Runner target is now included, providing the native application entry point, main menu interface, and window management required to run the Flutter app on macOS. This addition configures the app bundle with the identifier com.guozhigq.vvex and sets up network permissions, allowing the application to operate as a standard macOS client.
macos/Runner · high confidence
Initial project scaffolding and documentation for V2EX Flutter client
This change establishes the foundational structure for the V2EX Flutter application. It introduces standard Flutter project configuration files, including \.gitignore\ for build artifacts and IDE settings, \.metadata\ tracking the Flutter stable channel (revision 135454af32477f815a7525073027a3ff9eff1bfd), and \analysis\_options.yaml\ enabling the \flutter\_lints\ package for code quality. The project license is updated from Apache 2.0 to a new license file, and the \README.md\ is comprehensively rewritten to document the 'VVEX' app, listing features such as night mode, dynamic themes, automatic sign-in, advanced search, and Material You styling, along with environment setup and build instructions.
(repo-wide) · high confidence
Initial web entry point and PWA configuration added
The web entry point (index.html) and Progressive Web App manifest (manifest.json) have been added to the project. This enables the Flutter application to be served as a standalone web app with proper iOS meta tags, favicon support, and PWA capabilities including icon definitions and theme colors.
web · high confidence
Introduces adaptive navigation and layout components
The app now includes a new set of components in the adaptive module to support responsive design. This includes a navigation rail with slide-in animations for switching between sections (Topics, Nodes, Hot, History, Following, Favorites), a resizable split-view layout with a draggable divider for desktop/tablet screens, and a secondary body that displays topic details with dynamic color theming. Additionally, a trailing navigation rail provides access to theme selection, settings, and help.
lib/components/adaptive · high confidence
Introduction of local services for notifications, read status, and search history
This change introduces several new service classes in the \lib/service\ directory to handle core application features locally. \LocalNoticeService\ implements local push notifications using \flutter\_local\_notifications\, managing permissions and displaying alerts for replies and topic interactions. \Read\ utilizes Hive to cache recently viewed topics and track their read status, enabling the app to visually distinguish between new and previously seen content. \Search\ manages local search history via Hive, allowing users to view and clear past queries. Additionally, \i18n\_keyword.dart\ and \Translation\ provide the foundation for internationalization by defining static keys and mapping them to Chinese, English, and German strings.
lib/service · high confidence
New common UI components for loading states and navigation
This change introduces a suite of reusable UI components in the common library to enhance the user experience during data loading and navigation. It adds a custom AppBar with slide animations, skeleton screens (shimmer effects) for topic lists and recent topics to indicate loading states, and dedicated components for pull-to-refresh and infinite scroll loading. Additionally, it includes improved image handling with custom loading and error placeholders, a network error page with retry functionality, and a node tag component with updated click handling logic.
lib/components/common · high confidence
New data models for topics, replies, and user profiles
The application now includes a comprehensive set of new data models in the \lib/models/web\ directory to support richer content display and user interaction. This introduces structured classes for topic details (\TopicDetailModel\), including support for OP/MOD flags, favorites, and thanks, as well as reply items (\ReplyItem\) and subtle edits. It also adds models for member profiles (\ModelMemberProfile\), notifications (\MemberNoticeItem\), and social connections, alongside Hive-serialized types for caching topic lists (\TabTopicItem\) and node information (\NodeItem\). These changes enable features like reading status tracking, detailed topic views with nested replies, and personalized user profile pages.
lib/models/web · high confidence
New member profile pages with follow, block, and daily check-in features
Added a new member profile section including the main profile page (lib/pages/member/member\_id.dart), a replies list (lib/pages/member/member\_id\_replies.dart), and a topics list (lib/pages/member/member\_id\_topics.dart), along with the MemberController (lib/pages/member/controller.dart). The profile page allows users to view member details, perform daily check-ins to claim rewards (for the current user), and follow or block other users via confirmation dialogs. The replies and topics pages support paginated loading with pull-to-refresh and a floating action button to scroll back to the top.
lib/pages/member · high confidence
New search page with history, filtering, and scroll-to-top
The app now includes a dedicated search page (lib/pages/search) that displays search history, allows filtering by sort order and date range, and features a scroll-to-top button that appears when the user scrolls down. The view uses a pull-to-refresh mechanism for paginated results and shows a skeleton loader during the initial search request.
lib/pages/search · high confidence
New settings for display mode, font size, and node sorting
Added three new configuration pages in the settings area: a display mode selector to adjust screen refresh rates (using flutter\_displaymode), a global font size slider to adjust the app's text scale, and a node sorting interface that allows users to reorder and toggle the visibility of navigation tabs.
lib/pages/setting · high confidence
New support pages and settings for version history, network diagnostics, and privacy
The app now includes dedicated pages for viewing update logs (ChangeLogPage), checking network connectivity (NetworkCheckPage), and reading the privacy policy and user agreement (AgreementPage). These are accessible via the Help page, which also provides options to check for updates, view device information, and join the discussion group. Additionally, a new History page allows users to view and clear their recent browsing history, and a HistoryHotPage displays trending topics from an external feed.
lib/pages · high confidence
New topic detail page and controller in lib/pages/t
Added a new TopicController and TopicDetail page in the lib/pages/t directory. The controller manages topic state using GetX, while the page implements the UI for viewing topic details, including handling parameters for specific floors or replies, managing reply lists, and integrating with services for reading status and event buses.
lib/pages/t · high confidence
New topic detail page with rich content rendering and interaction tools
The topic detail view has been rebuilt with a new bottom bar that allows users to thank the topic creator, share the topic link, or open it in a browser. The main content area now uses a custom HTML renderer that supports syntax-highlighted code blocks, embedded tables, and image previews. Users can also reply to topics, mention multiple users via an @-mention selector, and save images locally.
lib/components/topic · high confidence
New utility infrastructure for caching, storage, and deep linking
The lib/utils directory has been populated with a comprehensive set of new utility modules that establish the app's core operational capabilities. This includes CacheManage for calculating and clearing image and network request caches, GStorage for persisting user preferences (such as theme, font size, and auto-sign settings) via GetStorage, and Hive integration for local data boxes like recent topics. Additionally, the update introduces VvexScheme for handling deep links and external app schemes, CustomProxy for system-level HTTP proxy support, and a dedicated Login module managing authentication flows including 2FA verification. These components collectively provide the foundational services for state management, offline storage, and navigation that the rest of the application relies on.
lib/utils · high confidence
Search history and advanced filtering options added
The search interface now includes a history component that displays recent search terms as clickable tags and allows users to clear the entire history via a confirmation dialog. Additionally, a new search menu provides advanced filtering capabilities, enabling users to sort results by weight or creation date, toggle between descending and ascending order, and restrict results to a specific date range using a date picker.
lib/components/search · high confidence
Support for @mentions, emojis, and images in text fields
The text input components now render special content types: @mentions are displayed with primary color styling and optional background highlighting, emojis are resolved from URLs and displayed as images, and HTML-style image tags are parsed and rendered with responsive sizing. A custom text selection toolbar is also provided, featuring a 'like' button that opens a mailto link with the selected text.
_lib/components/extended\text · high confidence
Architecture
HTTP layer refactored into modular Dio-based services
The HTTP implementation has been restructured from a monolithic approach into distinct, modular files under lib/http, including dio\_network.dart, dio\_web.dart, topic.dart, node.dart, user.dart, interceptor.dart, init.dart, github.dart, and soV2ex.dart. This change introduces the Dio library as the core HTTP client, replacing previous mechanisms with a centralized initialization in init.dart that manages cookies, interceptors (including login authentication and error handling), and logging. New capabilities include dedicated APIs for V2Ex topics and nodes, user profile management, GitHub release checking, and external search via SoV2ex, while the interceptor layer now enforces login requirements and handles 2FA validation.
lib/http · high confidence
Behavioural changes
New centralized routing configuration with swipe-back support
The application now uses a new \lib/router/app\_pages.dart\ file to centrally define all navigation routes using the GetX framework. This change introduces a \CustomGetPage\ wrapper that enables a swipe-back gesture (sideslip) on mobile devices, controlled by a user setting, while maintaining native transitions on iPad. The router registers pages for core features including login, topic and node details, user profiles, search, settings (font, display mode, node sorting), and history.
lib/router · high confidence
Redesigned home screen with adaptive navigation and topic list components
The home screen UI has been rebuilt using new modular components: a left drawer for navigation and settings, a search bar (with an adaptive variant for larger screens), a sticky tab bar, and a topic list view. The left drawer now manages login state and theme selection, while the search bar handles user profile access and notification visibility. The topic list component implements pagination, skeleton loading states, and scroll-based behaviors like auto-scrolling to top on tab changes and showing a 'back to top' button. These changes collectively provide a more responsive and feature-rich home experience, including support for adaptive layouts and improved navigation flow.
lib/components/home · high confidence
Test coverage
Added initial widget test for app shell rendering
Added a new widget test that verifies the application correctly renders the GetMaterialApp shell. The test initializes the test environment, mocks platform channels for path provider operations, and sets up GetStorage before confirming the presence of the main application widget.
test · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Baseline
- First survey — no prior run to compare against. CAI 57.
Lenses
- Code Health 78
- Architecture 93
- Maturity 57
- Readiness 44
- Security 79
- Domain Modelling 100
- Accessibility 74
Changes since last survey
- 300 commits — 235 feature/other, 65 fixes
By area
- lib/components — 67 commits
- (root) — 60 commits
- (repo) — 51 commits
- lib/pages — 42 commits
- lib/http — 26 commits
- .github/workflows — 15 commits
- lib/utils — 14 commits
- android/app — 10 commits
- lib/main.dart — 3 commits
- ios/Runner — 2 commits
- lib/controller — 2 commits
- lib/router — 2 commits
- ios/Podfile.lock — 1 commit
- ios/Runner 2023-03-19 22-40-57 — 1 commit
- ios/Runner.xcodeproj — 1 commit
- lib/models — 1 commit
- lib/service — 1 commit
- macos/Runner — 1 commit
Notable commits
- fix: Merge branch 'fix-tabList'
- fix: Merge pull request #46 from guozhigq/fix-refresh
- fix: Merge pull request #50 from guozhigq/fix-brower
- fix: Merge pull request #55 from guozhigq/fix-history
- fix: Merge pull request #67 from guozhigq/fix-base64Decode
- fix: fix: EasyRefresh.builder导致无法下拉、上拉刷新
- fix: fix: assets picker
- fix: fix: base64解析
- fix: fix: cookie存储路径异常
- fix: fix: default brower not support custom tabs
- fix: fix: google 2fa dialog路由事件失效
- fix: fix: google登录问题
- fix: fix: ios网络问题
- fix: fix: issues 83、issues 84
- fix: fix: openHref、topicId解析
- fix: fix: owner点击数
- fix: fix: search history
- fix: fix: tabList load more
- fix: fix: tablist刷新
- fix: fix: topicDetail setState error
- …and 280 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
guozhigq/flutter_v2ex was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 784b4c93f2815574466a1b12f6c814992cf6bb6c — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.