导航栏代码,配置文件
This commit is contained in:
19
ln_jq_app/lib/common/model/base_model.dart
Normal file
19
ln_jq_app/lib/common/model/base_model.dart
Normal file
@@ -0,0 +1,19 @@
|
||||
class BaseModel {
|
||||
bool? success;
|
||||
String? type;
|
||||
String? url;
|
||||
|
||||
BaseModel({this.success, this.type, this.url});
|
||||
|
||||
factory BaseModel.fromJson(Map<String, dynamic> json) => BaseModel(
|
||||
success: json['success']?.toString().contains("true"),
|
||||
type: json['type']?.toString(),
|
||||
url: json['url']?.toString(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
if (success != null) 'success': success,
|
||||
if (type != null) 'type': type,
|
||||
if (url != null) 'url': url,
|
||||
};
|
||||
}
|
||||
61
ln_jq_app/lib/common/styles/theme.dart
Normal file
61
ln_jq_app/lib/common/styles/theme.dart
Normal file
@@ -0,0 +1,61 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppTheme {
|
||||
static const String Font_Montserrat = 'Montserrat';
|
||||
|
||||
static const String Font_YuYang = 'YuYang';
|
||||
|
||||
static const Color themeColor = Color(0xFF0c83c3);
|
||||
|
||||
static const Color secondaryColor = Colors.orange;
|
||||
|
||||
static const Color darkThemeColor = Color(0xFF032896);
|
||||
|
||||
/// 亮色主题样式
|
||||
static ThemeData light = ThemeData(
|
||||
useMaterial3: false,
|
||||
fontFamily: Font_Montserrat,
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: themeColor,
|
||||
primary: themeColor,
|
||||
secondary: secondaryColor,
|
||||
brightness: Brightness.light,
|
||||
surface: Colors.white,
|
||||
surfaceTint: Colors.transparent,
|
||||
),
|
||||
appBarTheme: const AppBarTheme(
|
||||
backgroundColor: Colors.white,
|
||||
foregroundColor: Color.fromARGB(200, 0, 0, 0),
|
||||
centerTitle: true,
|
||||
titleTextStyle: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Color.fromARGB(200, 0, 0, 0),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
/// 暗色主题样式
|
||||
static ThemeData dark = ThemeData(
|
||||
useMaterial3: false,
|
||||
fontFamily: Font_Montserrat,
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: darkThemeColor,
|
||||
brightness: Brightness.dark,
|
||||
surface: const Color.fromARGB(255, 42, 42, 42),
|
||||
surfaceTint: Colors.transparent,
|
||||
),
|
||||
appBarTheme: const AppBarTheme(
|
||||
backgroundColor: Color.fromARGB(255, 34, 34, 34),
|
||||
centerTitle: true,
|
||||
titleTextStyle: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
bottomAppBarTheme: BottomAppBarThemeData(
|
||||
color: Color.fromARGB(255, 34, 34, 34),
|
||||
elevation: 4.0,
|
||||
),
|
||||
);
|
||||
}
|
||||
42
ln_jq_app/lib/main.dart
Normal file
42
ln_jq_app/lib/main.dart
Normal file
@@ -0,0 +1,42 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
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/home/view.dart';
|
||||
|
||||
import 'common/styles/theme.dart';
|
||||
import 'pages/login/view.dart';
|
||||
|
||||
/// Main
|
||||
void main() async {
|
||||
WidgetsBinding widgetsBinding = await init(isDebug: kDebugMode, logTag: '小羚羚');
|
||||
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
|
||||
runApp(
|
||||
GetxApp(
|
||||
// 设计稿尺寸 单位:dp
|
||||
designSize: const Size(390, 844),
|
||||
// Getx Log
|
||||
enableLog: kDebugMode,
|
||||
// 默认的跳转动画
|
||||
defaultTransition: Transition.rightToLeft,
|
||||
// 主题模式
|
||||
themeMode: GlobalService.to.themeMode,
|
||||
// 主题
|
||||
theme: AppTheme.light,
|
||||
// Dark主题
|
||||
darkTheme: AppTheme.dark,
|
||||
// AppTitle
|
||||
title: '小羚羚',
|
||||
// 首页入口
|
||||
home: HomePage(),
|
||||
// Builder
|
||||
builder: (context, widget) {
|
||||
// do something....
|
||||
return widget!;
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
18
ln_jq_app/lib/pages/b_page/base_widgets/controller.dart
Normal file
18
ln_jq_app/lib/pages/b_page/base_widgets/controller.dart
Normal 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;
|
||||
|
||||
}
|
||||
75
ln_jq_app/lib/pages/b_page/base_widgets/view.dart
Normal file
75
ln_jq_app/lib/pages/b_page/base_widgets/view.dart
Normal 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()),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
18
ln_jq_app/lib/pages/b_page/reservation/controller.dart
Normal file
18
ln_jq_app/lib/pages/b_page/reservation/controller.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
27
ln_jq_app/lib/pages/b_page/reservation/view.dart
Normal file
27
ln_jq_app/lib/pages/b_page/reservation/view.dart
Normal 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();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
18
ln_jq_app/lib/pages/b_page/site/controller.dart
Normal file
18
ln_jq_app/lib/pages/b_page/site/controller.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
26
ln_jq_app/lib/pages/b_page/site/view.dart
Normal file
26
ln_jq_app/lib/pages/b_page/site/view.dart
Normal 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();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
14
ln_jq_app/lib/pages/c_page/base_widgets/controller.dart
Normal file
14
ln_jq_app/lib/pages/c_page/base_widgets/controller.dart
Normal 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;
|
||||
|
||||
}
|
||||
4
ln_jq_app/lib/pages/c_page/base_widgets/index.dart
Normal file
4
ln_jq_app/lib/pages/c_page/base_widgets/index.dart
Normal file
@@ -0,0 +1,4 @@
|
||||
library base_widgets;
|
||||
|
||||
export 'controller.dart';
|
||||
export 'view.dart';
|
||||
91
ln_jq_app/lib/pages/c_page/base_widgets/view.dart
Normal file
91
ln_jq_app/lib/pages/c_page/base_widgets/view.dart
Normal 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()),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
18
ln_jq_app/lib/pages/c_page/car_info/controller.dart
Normal file
18
ln_jq_app/lib/pages/c_page/car_info/controller.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
26
ln_jq_app/lib/pages/c_page/car_info/view.dart
Normal file
26
ln_jq_app/lib/pages/c_page/car_info/view.dart
Normal 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();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
18
ln_jq_app/lib/pages/c_page/map/controller.dart
Normal file
18
ln_jq_app/lib/pages/c_page/map/controller.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
26
ln_jq_app/lib/pages/c_page/map/view.dart
Normal file
26
ln_jq_app/lib/pages/c_page/map/view.dart
Normal 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();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
18
ln_jq_app/lib/pages/c_page/mine/controller.dart
Normal file
18
ln_jq_app/lib/pages/c_page/mine/controller.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
26
ln_jq_app/lib/pages/c_page/mine/view.dart
Normal file
26
ln_jq_app/lib/pages/c_page/mine/view.dart
Normal 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();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
18
ln_jq_app/lib/pages/c_page/reservation/controller.dart
Normal file
18
ln_jq_app/lib/pages/c_page/reservation/controller.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
27
ln_jq_app/lib/pages/c_page/reservation/view.dart
Normal file
27
ln_jq_app/lib/pages/c_page/reservation/view.dart
Normal 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();
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
39
ln_jq_app/lib/pages/home/controller.dart
Normal file
39
ln_jq_app/lib/pages/home/controller.dart
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
23
ln_jq_app/lib/pages/home/view.dart
Normal file
23
ln_jq_app/lib/pages/home/view.dart
Normal 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);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
25
ln_jq_app/lib/pages/login/controller.dart
Normal file
25
ln_jq_app/lib/pages/login/controller.dart
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
242
ln_jq_app/lib/pages/login/view.dart
Normal file
242
ln_jq_app/lib/pages/login/view.dart
Normal 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());
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user