Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
提交反馈
为 GitLab 提交贡献
登录
切换导航
F
flutter_demo
项目
项目
详情
动态
版本
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
徐群-ios
flutter_demo
提交
16eba0c4
提交
16eba0c4
编写于
2月 24, 2023
作者:
徐群-ios
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add:添加登录页面
上级
512056c7
变更
10
显示空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
199 行增加
和
76 行删除
+199
-76
AssetImages.dart
lib/Assets/AssetImages.dart
+1
-1
Routes.dart
lib/Config/Routes.dart
+6
-0
CustomizationScreen.dart
lib/Customization/CustomizationScreen.dart
+36
-29
ProductDetailScreen.dart
lib/Customization/ProductDetailScreen.dart
+13
-0
HomeScreen.dart
lib/Home/HomeScreen.dart
+4
-4
LoginScreen.dart
lib/Login/LoginScreen.dart
+43
-0
UserViewModel.dart
lib/Login/ViewModel/UserViewModel.dart
+22
-0
MineScreen.dart
lib/Mine/MineScreen.dart
+2
-2
main.dart
lib/main.dart
+71
-39
widget_test.dart
test/widget_test.dart
+1
-1
未找到文件。
lib/Assets/AssetImages.dart
浏览文件 @
16eba0c4
// ignore_for_file: constant_identifier_names
class
AssetImages
{
static
const
String
right_arrow
=
'assets/multiImgs/right_arrow.png'
;
static
const
right_arrow
=
'assets/multiImgs/right_arrow.png'
;
}
lib/Config/Routes.dart
0 → 100644
浏览文件 @
16eba0c4
class
Routes
{
static
const
login
=
"login"
;
static
const
root
=
"/"
;
static
const
productDetail
=
"product_detail"
;
}
lib/Customization/Customization.dart
→
lib/Customization/Customization
Screen
.dart
浏览文件 @
16eba0c4
...
...
@@ -3,13 +3,15 @@ import 'dart:math' as math;
import
'package:easy_refresh/easy_refresh.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_spinkit/flutter_spinkit.dart'
;
import
'package:go_router/go_router.dart'
;
import
'package:my_app2/Assets/AssetImages.dart'
;
import
'package:my_app2/Config/Routes.dart'
;
import
'package:my_app2/Customization/ViewModel/ProductListViewModel.dart'
;
import
'package:my_app2/Models/ProductModel.dart'
;
import
'package:provider/provider.dart'
;
class
Customization
extends
StatelessWidget
{
const
Customization
({
super
.
key
});
class
Customization
Screen
extends
StatelessWidget
{
const
Customization
Screen
({
super
.
key
});
@override
Widget
build
(
BuildContext
context
)
{
...
...
@@ -50,7 +52,6 @@ class _CustomizationListImgState extends State<_CustomizationListImg> {
@override
void
dispose
()
{
_refreshController
.
dispose
();
widget
.
viewModel
.
dispose
();
super
.
dispose
();
}
...
...
@@ -202,14 +203,7 @@ class _ProductSliverBuilderDelegate extends SliverChildBuilderDelegate {
double
height
=
MediaQuery
.
of
(
context
).
size
.
width
-
12.0
*
2
;
var
item
=
dataSource
[
itemIndex
];
String
imgUrl
=
item
.
cover
;
widget
=
Container
(
decoration:
const
BoxDecoration
(
borderRadius:
BorderRadius
.
all
(
Radius
.
circular
(
12.0
))),
clipBehavior:
Clip
.
antiAlias
,
height:
height
,
child:
Stack
(
fit:
StackFit
.
expand
,
children:
[
var
children
=
<
Widget
>[
Image
.
network
(
imgUrl
),
Positioned
(
left:
0
,
...
...
@@ -225,17 +219,30 @@ class _ProductSliverBuilderDelegate extends SliverChildBuilderDelegate {
child:
Text
(
item
.
productName
,
style:
const
TextStyle
(
color:
Colors
.
white
,
fontWeight:
FontWeight
.
w600
),
color:
Colors
.
white
,
fontWeight:
FontWeight
.
w600
),
)),
Image
.
asset
(
AssetImages
.
right_arrow
)
]),
),
),
)
],
];
var
container
=
Container
(
decoration:
const
BoxDecoration
(
borderRadius:
BorderRadius
.
all
(
Radius
.
circular
(
12.0
))),
clipBehavior:
Clip
.
antiAlias
,
height:
height
,
child:
Stack
(
fit:
StackFit
.
expand
,
children:
children
,
),
);
widget
=
GestureDetector
(
child:
container
,
onTap:
()
{
context
.
go
(
'/product_detail'
);
},
);
}
else
{
widget
=
Divider
(
height:
spacing
,
...
...
lib/Customization/ProductDetailScreen.dart
0 → 100644
浏览文件 @
16eba0c4
import
'package:flutter/material.dart'
;
class
ProductDetailScreen
extends
StatelessWidget
{
const
ProductDetailScreen
({
super
.
key
});
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'这是产品详情页面'
)),
body:
const
Center
(
child:
Text
(
'这是一个产品详情页面'
)),
);
}
}
lib/Home/Home.dart
→
lib/Home/Home
Screen
.dart
浏览文件 @
16eba0c4
...
...
@@ -4,14 +4,14 @@ import 'package:my_app2/Models/BuyerShowModel.dart';
import
'package:flutter_swiper_view/flutter_swiper_view.dart'
;
import
'package:waterfall_flow/waterfall_flow.dart'
;
class
Home
extends
StatefulWidget
{
const
Home
({
super
.
key
});
class
Home
Screen
extends
StatefulWidget
{
const
Home
Screen
({
super
.
key
});
@override
State
<
Home
>
createState
()
=>
Home
State
();
State
<
Home
Screen
>
createState
()
=>
_HomeScreen
State
();
}
class
HomeState
extends
State
<
Home
>
{
class
_HomeScreenState
extends
State
<
HomeScreen
>
{
List
<
String
>
imgs
=
<
String
>[
"https://static.preclight.com/uploads/2022-12-07/639040aa41197.jpg"
,
"https://static.preclight.com/uploads/2022-12-07/6390419bf2995.jpg"
,
...
...
lib/Login/LoginScreen.dart
0 → 100644
浏览文件 @
16eba0c4
import
'package:flutter/material.dart'
;
import
'package:my_app2/Login/ViewModel/UserViewModel.dart'
;
import
'package:provider/provider.dart'
;
class
LoginScreen
extends
StatelessWidget
{
const
LoginScreen
({
super
.
key
});
@override
Widget
build
(
BuildContext
context
)
{
return
Scaffold
(
appBar:
AppBar
(
title:
const
Text
(
'登陆'
)),
body:
_LoginScreenImp
(),
);
}
}
class
_LoginScreenImp
extends
StatefulWidget
{
@override
State
<
_LoginScreenImp
>
createState
()
=>
_LoginScreenImpState
();
}
class
_LoginScreenImpState
extends
State
<
_LoginScreenImp
>
{
@override
Widget
build
(
BuildContext
context
)
{
return
Center
(
child:
Column
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
<
Widget
>[
ElevatedButton
(
onPressed:
()
{
// log a user in, letting all the listeners know
context
.
read
<
UserViewModel
>().
login
(
'test-user'
);
// router will automatically redirect from /login to / using
// refreshListenable
},
child:
const
Text
(
'Login'
),
),
],
),
);
}
}
lib/Login/ViewModel/UserViewModel.dart
0 → 100644
浏览文件 @
16eba0c4
import
'package:flutter/material.dart'
;
class
UserViewModel
extends
ChangeNotifier
{
/// The username of login.
String
get
userName
=>
_userName
;
String
_userName
=
''
;
/// Whether a user has logged in.
bool
get
loggedIn
=>
_userName
.
isNotEmpty
;
/// Logs in a user.
void
login
(
String
userName
)
{
_userName
=
userName
;
notifyListeners
();
}
/// Logs out the current user.
void
logout
()
{
_userName
=
''
;
notifyListeners
();
}
}
lib/Mine/Mine.dart
→
lib/Mine/Mine
Screen
.dart
浏览文件 @
16eba0c4
import
'package:flutter/material.dart'
;
class
Mine
extends
StatelessWidget
{
const
Mine
({
super
.
key
});
class
Mine
Screen
extends
StatelessWidget
{
const
Mine
Screen
({
super
.
key
});
@override
Widget
build
(
BuildContext
context
)
{
...
...
lib/main.dart
浏览文件 @
16eba0c4
import
'package:flutter/material.dart'
;
import
'package:flutter/services.dart'
;
import
'package:go_router/go_router.dart'
;
import
'package:my_app2/Customization/Customization.dart'
;
import
'package:my_app2/Home/Home.dart'
;
import
'package:my_app2/Mine/Mine.dart'
;
import
'package:my_app2/Config/Routes.dart'
;
import
'package:my_app2/Customization/CustomizationScreen.dart'
;
import
'package:my_app2/Customization/ProductDetailScreen.dart'
;
import
'package:my_app2/Home/HomeScreen.dart'
;
import
'package:my_app2/Login/LoginScreen.dart'
;
import
'package:my_app2/Login/ViewModel/UserViewModel.dart'
;
import
'package:my_app2/Mine/MineScreen.dart'
;
import
'package:my_app2/Network/http/ServiceManager.dart'
;
import
'package:my_app2/Network/service/XmhService.dart'
;
import
'package:my_app2/TabPageContainer.dart'
;
import
'package:provider/provider.dart'
;
void
main
(
)
{
runApp
(
const
MyApp
());
runApp
(
AppRoot
());
ServiceManager
().
registService
(
XmhService
());
SystemChrome
.
setPreferredOrientations
(
[
DeviceOrientation
.
portraitUp
,
DeviceOrientation
.
portraitDown
]);
}
// final GoRouter _router = GoRouter(routes: <RouteBase>[
// GoRoute(
// path: '/',
// builder: (context, state) => ExampleList(),
// routes: <RouteBase>[
// GoRoute(
// path: 'Example01',
// builder: (context, state) => Example01(),
// ),
// GoRoute(
// path: 'StackExample',
// builder: (context, state) => const StackExample(),
// )
// ])
// ]);
final
GoRouter
_router
=
GoRouter
(
routes:
<
RouteBase
>[
class
AppRoot
extends
StatelessWidget
{
AppRoot
({
super
.
key
});
final
UserViewModel
_userViewModel
=
UserViewModel
();
late
final
GoRouter
_router
=
GoRouter
(
initialLocation:
Routes
.
root
,
refreshListenable:
_userViewModel
,
routes:
<
RouteBase
>[
GoRoute
(
path:
Routes
.
root
,
builder:
(
context
,
state
)
=>
const
_AppImp
(),
routes:
<
RouteBase
>[
GoRoute
(
path:
Routes
.
productDetail
,
builder:
(
context
,
state
)
=>
const
ProductDetailScreen
(),
),
GoRoute
(
path:
'/'
,
builder:
(
context
,
state
)
=>
const
App
(),
routes:
<
RouteBase
>[])
]);
path:
Routes
.
login
,
pageBuilder:
(
context
,
state
)
{
return
const
MaterialPage
(
fullscreenDialog:
true
,
child:
LoginScreen
());
},
)
],
redirect:
(
context
,
state
)
{
// UserViewModel userVM = Provider.of<UserViewModel>(context);
UserViewModel
viewModel
=
context
.
read
<
UserViewModel
>();
final
bool
loggedIn
=
viewModel
.
loggedIn
;
final
bool
loggingIn
=
state
.
location
==
'/login'
;
if
(
state
.
location
==
'/product_detail'
&&
!
loggedIn
)
{
return
'/login'
;
}
class
MyApp
extends
StatelessWidget
{
const
MyApp
({
super
.
key
});
if
(
loggingIn
&&
loggedIn
)
{
return
'/'
;
}
},
),
],
);
@override
Widget
build
(
BuildContext
context
)
{
return
MaterialApp
.
router
(
return
MultiProvider
(
providers:
[
ChangeNotifierProvider
(
create:
(
context
)
=>
_userViewModel
,
)
],
child:
MaterialApp
.
router
(
theme:
ThemeData
(
brightness:
Brightness
.
light
,
colorSchemeSeed:
const
Color
(
0xFFFFAA22
),
useMaterial3:
true
),
routerConfig:
_router
,
);
)
);
}
}
class
Ap
p
extends
StatefulWidget
{
const
Ap
p
({
super
.
key
});
class
_AppIm
p
extends
StatefulWidget
{
const
_AppIm
p
({
super
.
key
});
@override
State
<
App
>
createState
()
=>
_Ap
pState
();
State
<
_AppImp
>
createState
()
=>
_AppIm
pState
();
}
class
_App
State
extends
State
<
Ap
p
>
{
class
_App
ImpState
extends
State
<
_AppIm
p
>
{
int
_currentIndex
=
0
;
@override
...
...
@@ -64,7 +96,7 @@ class _AppState extends State<App> {
return
Scaffold
(
body:
TabPageContainer
(
currentIndex:
_currentIndex
,
children:
const
[
Home
(),
Customization
(),
Mine
()]),
children:
const
[
Home
Screen
(),
CustomizationScreen
(),
MineScreen
()]),
bottomNavigationBar:
BottomNavigationBar
(
currentIndex:
_currentIndex
,
items:
const
[
...
...
test/widget_test.dart
浏览文件 @
16eba0c4
...
...
@@ -13,7 +13,7 @@ import 'package:my_app2/main.dart';
void
main
(
)
{
testWidgets
(
'Counter increments smoke test'
,
(
WidgetTester
tester
)
async
{
// Build our app and trigger a frame.
await
tester
.
pumpWidget
(
const
MyApp
());
await
tester
.
pumpWidget
(
AppRoot
());
// Verify that our counter starts at 0.
expect
(
find
.
text
(
'0'
),
findsOneWidget
);
...
...
编辑
预览
Markdown
格式
0%
请重试
or
添加新附件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
先完成此消息的编辑!
取消
想要评论请
注册
或
登录