提交 16eba0c4 编写于 作者: 徐群-ios's avatar 徐群-ios

add:添加登录页面

上级 512056c7
// 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';
}
class Routes {
static const login = "login";
static const root = "/";
static const productDetail = "product_detail";
}
......@@ -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 CustomizationScreen extends StatelessWidget {
const CustomizationScreen({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,40 +203,46 @@ class _ProductSliverBuilderDelegate extends SliverChildBuilderDelegate {
double height = MediaQuery.of(context).size.width - 12.0 * 2;
var item = dataSource[itemIndex];
String imgUrl = item.cover;
widget = Container(
var children = <Widget>[
Image.network(imgUrl),
Positioned(
left: 0,
right: 0,
bottom: 0,
child: Container(
color: Colors.black.withOpacity(0.3),
height: 50,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row(children: [
Expanded(
child: Text(
item.productName,
style: const TextStyle(
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: [
Image.network(imgUrl),
Positioned(
left: 0,
right: 0,
bottom: 0,
child: Container(
color: Colors.black.withOpacity(0.3),
height: 50,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row(children: [
Expanded(
child: Text(
item.productName,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.w600),
)),
Image.asset(AssetImages.right_arrow)
]),
),
),
)
],
children: children,
),
);
widget = GestureDetector(
child: container,
onTap: () {
context.go('/product_detail');
},
);
} else {
widget = Divider(
height: spacing,
......
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('这是一个产品详情页面')),
);
}
}
......@@ -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 HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<Home> createState() => HomeState();
State<HomeScreen> createState() => _HomeScreenState();
}
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",
......
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'),
),
],
),
);
}
}
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();
}
}
import 'package:flutter/material.dart';
class Mine extends StatelessWidget {
const Mine({super.key});
class MineScreen extends StatelessWidget {
const MineScreen({super.key});
@override
Widget build(BuildContext context) {
......
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>[
GoRoute(
path: '/',
builder: (context, state) => const App(),
routes: <RouteBase>[])
]);
class AppRoot extends StatelessWidget {
AppRoot({super.key});
class MyApp extends StatelessWidget {
const MyApp({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: 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';
}
if (loggingIn && loggedIn) {
return '/';
}
},
),
],
);
@override
Widget build(BuildContext context) {
return MaterialApp.router(
theme: ThemeData(
brightness: Brightness.light,
colorSchemeSeed: const Color(0xFFFFAA22),
useMaterial3: true),
routerConfig: _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 App extends StatefulWidget {
const App({super.key});
class _AppImp extends StatefulWidget {
const _AppImp({super.key});
@override
State<App> createState() => _AppState();
State<_AppImp> createState() => _AppImpState();
}
class _AppState extends State<App> {
class _AppImpState extends State<_AppImp> {
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 [HomeScreen(), CustomizationScreen(), MineScreen()]),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _currentIndex,
items: const [
......
......@@ -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 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册