导航栏代码,配置文件

This commit is contained in:
2025-11-03 14:19:21 +08:00
parent ac8a6387ef
commit 32fa975fb2
30 changed files with 2014 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
class B_BaseWidgetsController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'b_baseWidgets';
B_BaseWidgetsController();
@override
void onInit() {
super.onInit();
FlutterNativeSplash.remove();
}
int pageIndex = 0;
}

View File

@@ -0,0 +1,75 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/common/index.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/pages/b_page/base_widgets/controller.dart';
import 'package:ln_jq_app/pages/b_page/site/view.dart';
import 'package:ln_jq_app/pages/c_page/reservation/view.dart';
class B_BaseWidgetsPage extends GetView<B_BaseWidgetsController> {
B_BaseWidgetsPage({super.key});
final PageController _pageController = PageController();
// 主视图
Widget _buildView() {
return PageView(
controller: _pageController,
onPageChanged: (index) {
jumpTabAndPage(index);
},
children: _buildPages(), // 页面的列表
);
}
void jumpTabAndPage(int index) {
controller.pageIndex = index; // 更新页面索引
controller.updateUi(); // 更新 UI
_pageController.jumpToPage(controller.pageIndex);
}
// 对应的页面
List<Widget> _buildPages() {
return [
SitePage(),
ReservationPage(),
];
}
//导航栏
Widget _buildNavigationBar() {
return NavigationX(
currentIndex: controller.pageIndex, // 当前选中的tab索引
onTap: (index) {
jumpTabAndPage(index);
}, // 切换tab事件
items: [
NavigationItemModel(
label: '加氢预约',
icon: AntdIcon.orderedlist,
selectedIcon: AntdIcon.calendar_fill,
badge: '99+',
dot: true,
),
NavigationItemModel(
label: '站点信息',
icon: AntdIcon.car,
selectedIcon: AntdIcon.car_fill,
),
],
);
}
@override
Widget build(BuildContext context) {
return GetBuilder<B_BaseWidgetsController>(
init: B_BaseWidgetsController(),
id: 'b_baseWidgets',
builder: (_) {
return Scaffold(
extendBody: false,
resizeToAvoidBottomInset: false,
bottomNavigationBar: _buildNavigationBar(),
body: SafeArea(child: _buildView()),
);
},
);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:getx_scaffold/getx_scaffold.dart';
class ReservationController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'b_reservation';
ReservationController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'controller.dart';
class ReservationPage extends GetView<ReservationController> {
const ReservationPage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[
TextX.titleLarge('预约'),
].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<ReservationController>(
init: ReservationController(),
id: 'b_reservation',
builder: (_) {
return _buildView();
},
);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:getx_scaffold/getx_scaffold.dart';
class SiteController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'site';
SiteController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'controller.dart';
class SitePage extends GetView<SiteController> {
const SitePage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[
TextX.titleLarge('加氢预约 加氢站'),
].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<SiteController>(
init: SiteController(),
id: 'site',
builder: (_) {
return _buildView();
},
);
}
}

View File

@@ -0,0 +1,14 @@
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
class BaseWidgetsController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'baseWidgets';
BaseWidgetsController();
int pageIndex = 0;
}

View File

@@ -0,0 +1,4 @@
library base_widgets;
export 'controller.dart';
export 'view.dart';

View File

@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/common/index.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/pages/c_page/car_info/view.dart';
import 'package:ln_jq_app/pages/c_page/map/view.dart';
import 'package:ln_jq_app/pages/c_page/mine/view.dart';
import 'package:ln_jq_app/pages/c_page/reservation/view.dart';
import 'package:ln_jq_app/pages/demo/index.dart';
import 'index.dart';
class BaseWidgetsPage extends GetView<BaseWidgetsController> {
BaseWidgetsPage({super.key});
final PageController _pageController = PageController();
// 主视图
Widget _buildView() {
return PageView(
controller: _pageController,
onPageChanged: (index) {
jumpTabAndPage(index);
},
children: _buildPages(), // 页面的列表
);
}
void jumpTabAndPage(int index) {
controller.pageIndex = index; // 更新页面索引
controller.updateUi(); // 更新 UI
_pageController.jumpToPage(controller.pageIndex);
}
// 对应的页面
List<Widget> _buildPages() {
return [
MapPage(),
ReservationPage(),
CarInfoPage(),
MinePage(),
];
}
//导航栏
Widget _buildNavigationBar() {
return NavigationX(
currentIndex: controller.pageIndex, // 当前选中的tab索引
onTap: (index) {
jumpTabAndPage(index);
}, // 切换tab事件
items: [
NavigationItemModel(
label: '地图',
icon: AntdIcon.location,
selectedIcon: AntdIcon.location_fill,
dot: false,
),
NavigationItemModel(
label: '加氢预约',
icon: AntdIcon.orderedlist,
selectedIcon: AntdIcon.calendar_fill,
badge: '99+',
dot: true,
),
NavigationItemModel(
label: '车辆信息',
icon: AntdIcon.car,
selectedIcon: AntdIcon.car_fill,
),
NavigationItemModel(
label: '我的',
icon: AntdIcon.user,
selectedIcon: AntdIcon.user,
),
],
);
}
@override
Widget build(BuildContext context) {
return GetBuilder<BaseWidgetsController>(
init: BaseWidgetsController(),
id: 'baseWidgets',
builder: (_) {
return Scaffold(
extendBody: false,
resizeToAvoidBottomInset: false,
bottomNavigationBar: _buildNavigationBar(),
body: SafeArea(child: _buildView()),
);
},
);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:getx_scaffold/getx_scaffold.dart';
class CarInfoController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'car_info';
CarInfoController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'controller.dart';
class CarInfoPage extends GetView<CarInfoController> {
const CarInfoPage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[
TextX.titleLarge('车辆信息'),
].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<CarInfoController>(
init: CarInfoController(),
id: 'car_info',
builder: (_) {
return _buildView();
},
);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:getx_scaffold/getx_scaffold.dart';
class MapController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'map';
MapController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'controller.dart';
class MapPage extends GetView<MapController> {
const MapPage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[
TextX.titleLarge('地图'),
].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<MapController>(
init: MapController(),
id: 'map',
builder: (_) {
return _buildView();
},
);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:getx_scaffold/getx_scaffold.dart';
class MineController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'mine';
MineController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'controller.dart';
class MinePage extends GetView<MineController> {
const MinePage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[
TextX.titleLarge('我的'),
].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<MineController>(
init: MineController(),
id: 'mine',
builder: (_) {
return _buildView();
},
);
}
}

View File

@@ -0,0 +1,18 @@
import 'package:getx_scaffold/getx_scaffold.dart';
class ReservationController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'reservation';
ReservationController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'controller.dart';
class ReservationPage extends GetView<ReservationController> {
const ReservationPage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[
TextX.titleLarge('H2加氢站'),
].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<ReservationController>(
init: ReservationController(),
id: 'reservation',
builder: (_) {
return _buildView();
},
);
}
}

View File

@@ -0,0 +1,39 @@
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/pages/b_page/base_widgets/view.dart';
import 'package:ln_jq_app/pages/c_page/base_widgets/view.dart';
import 'package:ln_jq_app/pages/login/view.dart';
class HomeController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'home';
HomeController();
@override
void onInit() {
super.onInit();
FlutterNativeSplash.remove();
}
//登录状态 未登录跳转登录页
bool isLoggedIn = false;
// 登录渠道 加氢站b_login 司机端c_login
String loginChannel = "c_login";
String loginChannel_b = "b_login";
// 根据登录状态和登录渠道返回不同的首页
Widget getHomePage(bool isLoggedIn, String loginChannel) {
if (!isLoggedIn) {
return LoginPage(); // 未登录,跳转到登录页面
} else {
// 已登录,根据渠道判断跳转到不同的页面
if (loginChannel == "b_login") {
return BaseWidgetsPage(); // 渠道A进入 BaseWidgetsPage
} else {
return B_BaseWidgetsPage(); // 渠道B进入 B_BaseWidgetsPage
}
}
}
}

View File

@@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/pages/home/controller.dart';
class HomePage extends GetView<HomeController> {
const HomePage({super.key});
// 主视图
Widget _buildView() {
return <Widget>[Text('主页面')].toColumn(mainAxisSize: MainAxisSize.min).center();
}
@override
Widget build(BuildContext context) {
return GetBuilder<HomeController>(
init: HomeController(),
id: 'home',
builder: (_) {
return controller.getHomePage(false, controller.loginChannel);
},
);
}
}

View File

@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
class LoginController extends GetxController with BaseControllerMixin {
@override
String get builderId => 'login';
LoginController();
// 控制输入框的 TextEditingController
final TextEditingController driverIdentityController = TextEditingController();
final TextEditingController stationIdController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
super.onClose();
}
}

View File

@@ -0,0 +1,242 @@
import 'package:flutter/material.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'package:ln_jq_app/common/styles/theme.dart';
import 'package:ln_jq_app/pages/b_page/base_widgets/view.dart';
import 'package:ln_jq_app/pages/c_page/base_widgets/view.dart';
import 'package:ln_jq_app/pages/login/controller.dart';
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> with SingleTickerProviderStateMixin {
late TabController tabController;
//默认司机端
bool cLogin = true;
bool _obscureText = true; // 默认密码为隐藏状态
@override
void initState() {
super.initState();
// 初始化 TabController传入 vsync 参数
tabController = TabController(length: 2, vsync: this);
tabController.addListener(_tabChangeListener);
}
void _tabChangeListener() {
// 如果 TabController 不是正在被用户手动滑动(即是初始化或其他操作)
if (!tabController.indexIsChanging) {
switchTab(tabController.index);
}
}
// 切换Tab
void switchTab(int index) {
setState(() {
cLogin = (index == 0);
});
}
@override
void dispose() {
tabController.dispose(); // 销毁 TabController
super.dispose();
}
// 主视图
Widget _buildView() {
// 使用 Get.find 获取控制器
final controller = Get.find<LoginController>();
return Container(
color: Color(0xFFEFF4F7),
child: <Widget>[
Icon(cLogin ? AntdIcon.car : AntdIcon.USB),
SizedBox(height: 5.h),
TextX.bodyLarge(cLogin ? '司机端' : "加氢站", weight: FontWeight.w700),
SizedBox(height: 5.h),
TextX.bodyLarge(cLogin ? '安全驾驶·智能服务' : "氢能服务·专业运营"),
Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15), // 设置圆角弧度
),
margin: EdgeInsets.all(15),
elevation: 4,
child: Container(
height: cLogin ? 260.h : 320.h,
padding: EdgeInsets.all(15),
child: // TabBar切换
Column(
children: [
Card(
elevation: 2,
child: Padding(
padding: EdgeInsets.all(3),
child: TabBar(
controller: tabController,
onTap: (index) {
//保证尺寸变化
delayed(300, () {
switchTab(index);
});
},
// 修改TabBar的选中状态和未选中状态样式
labelColor: Colors.white,
// 选中时的文字颜色
unselectedLabelColor: Colors.black,
// 未选中时的文字颜色
indicator: BoxDecoration(
color: AppTheme.themeColor, // 选中的Tab背景色模拟卡片式效果
borderRadius: BorderRadius.circular(12), // 卡片的圆角效果
boxShadow: [
BoxShadow(
color: Colors.blue.withOpacity(0.2),
spreadRadius: 1,
blurRadius: 6,
),
],
),
tabs: [
Tab(text: '司机端登录'),
Tab(text: '加氢站登录'),
],
isScrollable: false,
),
),
),
// 根据选择的Tab展示不同的输入框
Flexible(
child: TabBarView(
controller: tabController,
children: [
// 司机端登录
_driverLoginView(controller),
// 加氢站登录
_stationLoginView(controller),
],
),
),
],
),
),
),
].toColumn(mainAxisSize: MainAxisSize.min).center(),);
}
// 司机端登录界面
Widget _driverLoginView(LoginController controller) {
return !cLogin
? SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 20.h),
TextFormField(
controller: controller.driverIdentityController,
cursorColor: AppTheme.themeColor,
maxLength: 8,
decoration: InputDecoration(
hintText: '请输入身份后8位',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.person_2_outlined, color: Colors.grey),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: AppTheme.themeColor),
),
),
),
SizedBox(height: 20.h),
ElevatedButton(
onPressed: () {
// 司机端登录
Get.to(() => BaseWidgetsPage());
},
style: ElevatedButton.styleFrom(
backgroundColor: AppTheme.themeColor,
minimumSize: Size(double.infinity, 50), // 设置按钮宽度占满,指定最小高度
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
child: Text('登录'),
),
],
);
}
// 加氢站登录界面
Widget _stationLoginView(LoginController controller) {
return cLogin
? SizedBox()
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 20),
TextFormField(
controller: controller.stationIdController,
cursorColor: AppTheme.themeColor,
decoration: InputDecoration(
hintText: '请输入加氢站编号',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.person_2_outlined, color: Colors.grey),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: AppTheme.themeColor),
),
),
),
SizedBox(height: 20),
TextFormField(
controller: controller.passwordController,
obscureText: _obscureText,
cursorColor: AppTheme.themeColor,
decoration: InputDecoration(
hintText: '请输入密码',
border: OutlineInputBorder(),
suffixIcon: IconButton(
icon: Icon(
_obscureText ? Icons.visibility_off : Icons.visibility, // 切换图标
),
onPressed: () {
setState(() {
_obscureText = !_obscureText;
});
},
),
prefixIcon: Icon(Icons.lock_outline, color: Colors.grey),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: AppTheme.themeColor),
),
),
),
SizedBox(height: 20),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: AppTheme.themeColor,
minimumSize: Size(double.infinity, 50), // 设置按钮宽度占满,指定最小高度
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
),
onPressed: () {
// 加氢站登录逻辑
Get.to(() => B_BaseWidgetsPage());
},
child: Text('登录'),
),
],
);
}
@override
Widget build(BuildContext context) {
return GetBuilder<LoginController>(
init: LoginController(),
id: 'login',
builder: (_) {
return Scaffold(body: _buildView());
},
);
}
}