diff --git a/lib/components/region_selector.dart b/lib/components/region_selector.dart index becae34..c5cd852 100644 --- a/lib/components/region_selector.dart +++ b/lib/components/region_selector.dart @@ -22,6 +22,7 @@ class RegionSelector extends StatelessWidget { @override Widget build(BuildContext context) { return SizedBox( + width: 420, height: 100, child: Consumer( builder: (context, regionProvider, child) => Column( @@ -54,12 +55,17 @@ class RegionSelector extends StatelessWidget { // SizedBox(width: 8), Row( children: [ - InkWell( - child: Icon(Icons.close, - size: 20, color: Colors.grey[500]), - onTap: () {}), + (regionProvider.tempProvinceName != '') + ? InkWell( + child: Icon(Icons.close, + size: 30, + color: Colors.grey[500]), + onTap: () { + regionProvider.clearTemp(); + }) + : const SizedBox(), Icon(Icons.keyboard_arrow_down, - size: 28, color: Colors.grey[500]), + size: 30, color: Colors.grey[500]), ], ) ], diff --git a/lib/main.dart b/lib/main.dart index 97fe050..391d61b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,6 @@ import 'package:fengshui_compass/bottom_navigation_widget.dart'; import 'package:fengshui_compass/states/region.dart'; +import 'package:fengshui_compass/states/token.dart'; import 'package:fengshui_compass/utils/color.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; @@ -10,8 +11,13 @@ void main() { ///屏幕刷新率和显示率不一致时的优化 // GestureBinding.instance.resamplingEnabled = true; runApp( - ChangeNotifierProvider( - create: (context) => RegionProvider(), + MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => RegionProvider(), + ), + ChangeNotifierProvider(create: (context) => TokenProvider()), + ], child: const MyApp(), ), ); diff --git a/lib/pages/compass_page.dart b/lib/pages/compass_page.dart index 2f9a6ae..fb05662 100644 --- a/lib/pages/compass_page.dart +++ b/lib/pages/compass_page.dart @@ -44,10 +44,6 @@ class _CompassState extends State { var listb = []; var listc = []; - // 省市名称,用于获取磁偏角 - String proviceName = ''; - String cityName = ''; - void initDevice() {} @override @@ -275,6 +271,11 @@ class _CompassState extends State { title: Text('选择城市校准磁偏角'), content: RegionSelector(), actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text('关闭')), TextButton( onPressed: () { Provider.of(context, listen: false) diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index ea01de8..579a945 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -2,17 +2,17 @@ import 'package:fengshui_compass/components/custom_textfield_widget.dart'; import 'package:fengshui_compass/models/login_bean.dart'; import 'package:fengshui_compass/net/dio_utils.dart'; import 'package:fengshui_compass/pages/register_page.dart'; +import 'package:fengshui_compass/states/token.dart'; import 'package:fengshui_compass/utils/token_helper.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import '../components/controller.dart'; -import '../models/user_bean.dart'; -import '../utils/user_helper.dart'; class LoginPage extends StatefulWidget { - final String username; + const LoginPage({Key key, this.username}) : super(key: key); @override @@ -20,7 +20,6 @@ class LoginPage extends StatefulWidget { } class _LoginPageState extends State { - final FocusNode _userNameFocusNode = FocusNode(); final FocusNode _passwordFocusNode = FocusNode(); @@ -31,7 +30,7 @@ class _LoginPageState extends State { @override void initState() { - if(widget.username != null) { + if (widget.username != null) { setState(() { _userNameEditController.text = widget.username; }); @@ -39,10 +38,8 @@ class _LoginPageState extends State { super.initState(); } - @override Widget build(BuildContext context) { - return Scaffold( // appBar: AppBar( // elevation: 0, @@ -109,11 +106,13 @@ class _LoginPageState extends State { submit: (value) { if (value.length != 11) { Fluttertoast.showToast(msg: "请输入11位手机号"); - FocusScope.of(context).requestFocus(_userNameFocusNode); + FocusScope.of(context) + .requestFocus(_userNameFocusNode); return; } _userNameFocusNode.unfocus(); - FocusScope.of(context).requestFocus(_passwordFocusNode); + FocusScope.of(context) + .requestFocus(_passwordFocusNode); }, focusNode: _userNameFocusNode, prefixIconData: Icons.phone_android_outlined, @@ -124,9 +123,10 @@ class _LoginPageState extends State { TextFieldWidget( hintText: "密码", submit: (value) { - if(value.length < 5) { + if (value.length < 5) { Fluttertoast.showToast(msg: "请输入5位以上密码"); - FocusScope.of(context).requestFocus(_passwordFocusNode); + FocusScope.of(context) + .requestFocus(_passwordFocusNode); return; } _userNameFocusNode.unfocus(); @@ -163,12 +163,14 @@ class _LoginPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ const Text("没有账号, "), - TextButton(onPressed: (){ - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => RegisterPage())); - }, child: const Text("点击注册")) + TextButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RegisterPage())); + }, + child: const Text("点击注册")) ], ) ], @@ -180,17 +182,17 @@ class _LoginPageState extends State { ); } - void submitFunction() async{ + void submitFunction() async { // 获取输入用户名密码 String userName = _userNameEditController.text; String password = _passwordEditController.text; - if(userName.trim().length != 11) { + if (userName.trim().length != 11) { Fluttertoast.showToast(msg: "请输入11位手机号"); return; } - if(password.trim().length < 5) { + if (password.trim().length < 5) { Fluttertoast.showToast(msg: "请输入5位以上密码"); } @@ -207,23 +209,20 @@ class _LoginPageState extends State { ); if (responseInfo.success) { - Map res = { - "token": responseInfo.token.toString() - }; - LoginBean loginBean = LoginBean.fromMap(res); - TokenHelper.getInstance.loginBean = loginBean; - - Fluttertoast.showToast(msg: "登录成功"); - - //关闭当前页面 - Navigator.of(context).pop(true); - //发送消息更新我的页面显示内容 - loginStreamController.add(0); + Map res = {"token": responseInfo.token.toString()}; + LoginBean loginBean = LoginBean.fromMap(res); + TokenHelper.getInstance.loginBean = loginBean; + // 将token添加到状态管理器中 + Provider.of(context, listen: false).setToken(loginBean); + Fluttertoast.showToast(msg: "登录成功"); + //关闭当前页面 + Navigator.of(context).pop(true); + //发送消息更新我的页面显示内容 + // loginStreamController.add(0); } else { - //登录失败页面小提示 - Fluttertoast.showToast(msg: responseInfo.msg); - } - + //登录失败页面小提示 + Fluttertoast.showToast(msg: responseInfo.msg); + } } } diff --git a/lib/pages/personal_login_page.dart b/lib/pages/personal_login_page.dart index eaac708..5186699 100644 --- a/lib/pages/personal_login_page.dart +++ b/lib/pages/personal_login_page.dart @@ -1,9 +1,9 @@ -import 'package:fengshui_compass/pages/personal_page.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import '../bottom_navigation_widget.dart'; -import '../utils/navigator_utils.dart'; +import '../states/token.dart'; import '../utils/token_helper.dart'; // 用户未登录页面 @@ -26,15 +26,21 @@ class _PersonalLoginPageState extends State { body: Container( width: double.infinity, child: Column( - children:[ + children: [ Padding(padding: EdgeInsets.only(top: 80)), - SizedBox(height: 120,child: ClipRRect(borderRadius: BorderRadius.circular(60),child: Image.asset("assets/images/ic_launcher.png"),),), + SizedBox( + height: 120, + child: ClipRRect( + borderRadius: BorderRadius.circular(60), + child: Image.asset("assets/images/ic_launcher.png"), + ), + ), Padding(padding: EdgeInsets.only(top: 30)), ListTile( title: Text("关于我们"), trailing: const Icon(Icons.arrow_forward_ios_sharp), leading: const Icon(Icons.account_circle), - onTap: (){}, + onTap: () {}, ), ListTile( title: Text("退出登陆"), @@ -43,7 +49,7 @@ class _PersonalLoginPageState extends State { onTap: () async { bool isExit = await showCupertinoDialog( context: context, - builder: (BuildContext context){ + builder: (BuildContext context) { return CupertinoAlertDialog( title: const Text("温馨提示"), content: Container( @@ -69,11 +75,13 @@ class _PersonalLoginPageState extends State { if (isExit) { TokenHelper.getInstance.clear(); - Navigator.of(context).push( - MaterialPageRoute(builder: (context) { - return BottomNavigationWidget(); - }) - ); + //在状态管理器中清除token + Provider.of(context, listen: false) + .clearToken(); + Navigator.of(context) + .push(MaterialPageRoute(builder: (context) { + return BottomNavigationWidget(); + })); } }) ], diff --git a/lib/pages/personal_page.dart b/lib/pages/personal_page.dart index 8a5c7b8..4f5b59d 100644 --- a/lib/pages/personal_page.dart +++ b/lib/pages/personal_page.dart @@ -1,10 +1,9 @@ -import 'package:fengshui_compass/components/controller.dart'; import 'package:fengshui_compass/pages/personal_login_page.dart'; import 'package:fengshui_compass/pages/personal_nologin_page.dart'; +import 'package:fengshui_compass/states/token.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - -import '../utils/token_helper.dart'; +import 'package:provider/provider.dart'; class PersonalPage extends StatefulWidget { const PersonalPage({Key key}) : super(key: key); @@ -14,29 +13,48 @@ class PersonalPage extends StatefulWidget { } class _PersonalPageState extends State { - @override - void initState() { - super.initState(); - loginStreamController.stream.listen((event) { - setState(() {}); - }); - } - - @override - void dispose() { - loginStreamController.close(); - super.dispose(); - } + // @override + // void initState() { + // super.initState(); + // loginStreamController.stream.listen((event) { + // setState(() {}); + // }); + // } + // + // @override + // void dispose() { + // loginStreamController.close(); + // super.dispose(); + // } @override Widget build(BuildContext context) { - // 判断用户是否登陆 - if (TokenHelper.getInstance.isLogin) { - // 构建已登录页面 - return PersonalLoginPage(); - } else { - // 构建未登录页面 - return PersonalNoLoginPage(); - } + return Consumer(builder: (builder, tokenProvider, child) { + if (tokenProvider.isLogin) { + // 构建已登录页面 + return PersonalLoginPage(); + } else { + // 构建未登录页面 + return PersonalNoLoginPage(); + } + }); } } +// ); +// +// // 判断用户是否登陆 +// if +// +// ( +// +// TokenHelper.getInstance.isLogin +// +// ) { +// print(TokenHelper.getInstance.isLogin); +// // 构建已登录页面 +// return PersonalLoginPage(); +// } else { +// // 构建未登录页面 +// return PersonalNoLoginPage(); +// } +// }} diff --git a/lib/states/region.dart b/lib/states/region.dart index 687c0e3..fe32ba4 100644 --- a/lib/states/region.dart +++ b/lib/states/region.dart @@ -63,9 +63,17 @@ class RegionProvider extends ChangeNotifier { notifyListeners(); } + // 覆盖临时的变量 resetTemp() async { _tempProvinceName = _provinceName; _tempCityName = _cityName; notifyListeners(); } + + // 将临时的省市名设为空 + clearTemp() { + _tempProvinceName = ''; + _tempCityName = ''; + notifyListeners(); + } } diff --git a/lib/states/token.dart b/lib/states/token.dart new file mode 100644 index 0000000..0a44375 --- /dev/null +++ b/lib/states/token.dart @@ -0,0 +1,33 @@ +import 'package:fengshui_compass/utils/sp_utils.dart'; +import 'package:flutter/material.dart'; + +import '../models/login_bean.dart'; + +class TokenProvider extends ChangeNotifier { + TokenProvider() { + loadToken(); + } + + LoginBean _loginBean; + + bool get isLogin => _loginBean != null; + + loadToken() { + Map map = SPUtil.getObject("token_bean"); + if (map != null) { + //加载缓存 + _loginBean = LoginBean.fromMap(map); + } + notifyListeners(); + } + + clearToken() { + _loginBean = null; + notifyListeners(); + } + + setToken(LoginBean lb) { + _loginBean = lb; + notifyListeners(); + } +}