字
字节笔记本
2026年2月22日
EtornamVpnFlutter:Flutter VPN 应用 UI 实现项目
本文介绍 EtornamVpnFlutter,一个使用 Flutter 开发的 VPN 应用 UI 实现项目。该项目展示了如何构建一个具有服务器列表选择功能的跨平台 VPN 客户端界面,包含免费和付费服务器的分类展示。
项目简介
EtornamVpnFlutter 是一个开源的 Flutter VPN 应用 UI 实现项目,由 Etornam Sunu 开发维护。截至目前,该项目在 GitHub 上已获得 161 stars 和 54 forks,主要使用 Dart 语言编写。项目提供了完整的 VPN 服务器列表选择界面实现,支持展示不同国家的服务器节点。
核心特性
- 服务器列表展示:支持展示多个国家的 VPN 服务器节点
- 分类管理:区分免费服务器和付费服务器,UI 上通过锁图标标识付费服务器
- 国旗图标:使用圆形头像展示各国国旗,直观识别服务器位置
- 服务器选择:通过勾选框实现服务器单选功能
- 跨平台支持:基于 Flutter 框架,可同时构建 Android 和 iOS 应用
- 主题适配:支持跟随系统主题变化
技术栈
- Flutter:Google 开源的跨平台 UI 框架
- Dart:Flutter 的开发语言
- roundcheckbox:圆形勾选框组件库
- Material Design:遵循 Material Design 设计规范
核心代码解析
Server 数据模型
dart
class Server {
String? flag;
String? name;
String? domain;
String? username;
String? password;
int? port;
int? mtu;
Server({this.flag, this.name, this.domain, this.username, this.password, this.port, this.mtu});
}服务器列表页面实现
server_list_page.dart 文件实现了服务器选择页面的核心功能:
1. 服务器数据定义
页面中定义了两组服务器列表:
premiumServers:付费服务器列表(包含英国、美国、加拿大、法国、加纳等节点)freeServers:免费服务器列表(包含英国、法国、加纳等节点)
2. 页面布局结构
dart
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
Navigator.of(context).pop(server);
return true;
},
child: Scaffold(
appBar: AppBar(
title: Text('Servers'),
),
body: ListView(...),
),
);
}3. 付费服务器列表展示
使用 ServerItemWidget 组件展示付费服务器,通过 isFaded: true 和 icon: Icons.lock 标识为锁定状态:
dart
ListView.separated(
shrinkWrap: true,
itemCount: premiumServers.length,
itemBuilder: (_, index) {
return ServerItemWidget(
isFaded: true,
label: premiumServers[index].name!,
icon: Icons.lock,
flagAsset: premiumServers[index].flag!,
onTap: () {
setState(() {
server = premiumServers[index];
});
}
);
},
separatorBuilder: (_, index) => SizedBox(height: 10),
)4. 免费服务器列表展示
免费服务器使用自定义布局,包含国旗、国家名称和勾选框:
dart
Material(
borderRadius: BorderRadius.circular(10),
color: Theme.of(context).cardColor,
child: Padding(
padding: const EdgeInsets.all(7.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
children: [
CircleAvatar(
radius: 15,
backgroundColor: Colors.white,
backgroundImage: ExactAssetImage(freeServers[index].flag!),
),
SizedBox(width: 15),
Text(freeServers[index].name!),
],
),
RoundCheckBox(
size: 24,
isChecked: freeServers[index] == server,
onTap: (x) {
setState(() {
server = freeServers[index];
});
},
),
],
),
),
)安装指南
前置要求
- Flutter SDK
- Android Studio / VSCode / IntelliJ IDE
- Android SDK(开发 Android 应用)
- macOS + Xcode(开发 iOS 应用)
安装步骤
bash
# 克隆项目
git clone https://github.com/iamEtornam/EtornamVpnFlutter.git
# 进入项目目录
cd EtornamVpnFlutter
# 安装依赖
flutter pub get
# 运行应用
flutter run构建发布版本
bash
# Android
flutter build apk
flutter build appbundle
# iOS
flutter build ios项目结构
text
lib/
├── screens/
│ ├── server_list_page.dart # 服务器列表页面
│ └── shared_widgets/
│ └── server_list_widget.dart # 服务器列表组件
├── main.dart # 应用入口
└── ...使用建议
- 服务器配置:修改
server_list_page.dart中的premiumServers和freeServers列表来配置实际的服务器节点 - 国旗资源:将国旗图片放入
assets/目录并在pubspec.yaml中声明 - VPN 功能集成:此项目仅提供 UI 实现,需要额外集成 VPN 连接功能(如使用
flutter_vpn等插件)
项目链接
- GitHub 仓库:https://github.com/iamEtornam/EtornamVpnFlutter
- 作者主页:https://github.com/iamEtornam
- 许可证:MIT License
分享: