登录后重新渲染个人页面bug fixed

This commit is contained in:
cxc
2022-06-28 16:21:47 +08:00
parent 2a933199ed
commit 7974cfd1ed
8 changed files with 161 additions and 82 deletions

View File

@ -22,6 +22,7 @@ class RegionSelector extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SizedBox( return SizedBox(
width: 420,
height: 100, height: 100,
child: Consumer<RegionProvider>( child: Consumer<RegionProvider>(
builder: (context, regionProvider, child) => Column( builder: (context, regionProvider, child) => Column(
@ -54,12 +55,17 @@ class RegionSelector extends StatelessWidget {
// SizedBox(width: 8), // SizedBox(width: 8),
Row( Row(
children: [ children: [
InkWell( (regionProvider.tempProvinceName != '')
child: Icon(Icons.close, ? InkWell(
size: 20, color: Colors.grey[500]), child: Icon(Icons.close,
onTap: () {}), size: 30,
color: Colors.grey[500]),
onTap: () {
regionProvider.clearTemp();
})
: const SizedBox(),
Icon(Icons.keyboard_arrow_down, Icon(Icons.keyboard_arrow_down,
size: 28, color: Colors.grey[500]), size: 30, color: Colors.grey[500]),
], ],
) )
], ],

View File

@ -1,5 +1,6 @@
import 'package:fengshui_compass/bottom_navigation_widget.dart'; import 'package:fengshui_compass/bottom_navigation_widget.dart';
import 'package:fengshui_compass/states/region.dart'; import 'package:fengshui_compass/states/region.dart';
import 'package:fengshui_compass/states/token.dart';
import 'package:fengshui_compass/utils/color.dart'; import 'package:fengshui_compass/utils/color.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
@ -10,8 +11,13 @@ void main() {
///屏幕刷新率和显示率不一致时的优化 ///屏幕刷新率和显示率不一致时的优化
// GestureBinding.instance.resamplingEnabled = true; // GestureBinding.instance.resamplingEnabled = true;
runApp( runApp(
ChangeNotifierProvider( MultiProvider(
create: (context) => RegionProvider(), providers: [
ChangeNotifierProvider(
create: (context) => RegionProvider(),
),
ChangeNotifierProvider(create: (context) => TokenProvider()),
],
child: const MyApp(), child: const MyApp(),
), ),
); );

View File

@ -44,10 +44,6 @@ class _CompassState extends State<CompassPage> {
var listb = []; var listb = [];
var listc = []; var listc = [];
// 省市名称,用于获取磁偏角
String proviceName = '';
String cityName = '';
void initDevice() {} void initDevice() {}
@override @override
@ -275,6 +271,11 @@ class _CompassState extends State<CompassPage> {
title: Text('选择城市校准磁偏角'), title: Text('选择城市校准磁偏角'),
content: RegionSelector(), content: RegionSelector(),
actions: <Widget>[ actions: <Widget>[
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('关闭')),
TextButton( TextButton(
onPressed: () { onPressed: () {
Provider.of<RegionProvider>(context, listen: false) Provider.of<RegionProvider>(context, listen: false)

View File

@ -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/models/login_bean.dart';
import 'package:fengshui_compass/net/dio_utils.dart'; import 'package:fengshui_compass/net/dio_utils.dart';
import 'package:fengshui_compass/pages/register_page.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:fengshui_compass/utils/token_helper.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart'; import 'package:fluttertoast/fluttertoast.dart';
import 'package:provider/provider.dart';
import '../components/controller.dart'; import '../components/controller.dart';
import '../models/user_bean.dart';
import '../utils/user_helper.dart';
class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
final String username; final String username;
const LoginPage({Key key, this.username}) : super(key: key); const LoginPage({Key key, this.username}) : super(key: key);
@override @override
@ -20,7 +20,6 @@ class LoginPage extends StatefulWidget {
} }
class _LoginPageState extends State<LoginPage> { class _LoginPageState extends State<LoginPage> {
final FocusNode _userNameFocusNode = FocusNode(); final FocusNode _userNameFocusNode = FocusNode();
final FocusNode _passwordFocusNode = FocusNode(); final FocusNode _passwordFocusNode = FocusNode();
@ -31,7 +30,7 @@ class _LoginPageState extends State<LoginPage> {
@override @override
void initState() { void initState() {
if(widget.username != null) { if (widget.username != null) {
setState(() { setState(() {
_userNameEditController.text = widget.username; _userNameEditController.text = widget.username;
}); });
@ -39,10 +38,8 @@ class _LoginPageState extends State<LoginPage> {
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
// appBar: AppBar( // appBar: AppBar(
// elevation: 0, // elevation: 0,
@ -109,11 +106,13 @@ class _LoginPageState extends State<LoginPage> {
submit: (value) { submit: (value) {
if (value.length != 11) { if (value.length != 11) {
Fluttertoast.showToast(msg: "请输入11位手机号"); Fluttertoast.showToast(msg: "请输入11位手机号");
FocusScope.of(context).requestFocus(_userNameFocusNode); FocusScope.of(context)
.requestFocus(_userNameFocusNode);
return; return;
} }
_userNameFocusNode.unfocus(); _userNameFocusNode.unfocus();
FocusScope.of(context).requestFocus(_passwordFocusNode); FocusScope.of(context)
.requestFocus(_passwordFocusNode);
}, },
focusNode: _userNameFocusNode, focusNode: _userNameFocusNode,
prefixIconData: Icons.phone_android_outlined, prefixIconData: Icons.phone_android_outlined,
@ -124,9 +123,10 @@ class _LoginPageState extends State<LoginPage> {
TextFieldWidget( TextFieldWidget(
hintText: "密码", hintText: "密码",
submit: (value) { submit: (value) {
if(value.length < 5) { if (value.length < 5) {
Fluttertoast.showToast(msg: "请输入5位以上密码"); Fluttertoast.showToast(msg: "请输入5位以上密码");
FocusScope.of(context).requestFocus(_passwordFocusNode); FocusScope.of(context)
.requestFocus(_passwordFocusNode);
return; return;
} }
_userNameFocusNode.unfocus(); _userNameFocusNode.unfocus();
@ -163,12 +163,14 @@ class _LoginPageState extends State<LoginPage> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const Text("没有账号, "), const Text("没有账号, "),
TextButton(onPressed: (){ TextButton(
Navigator.push( onPressed: () {
context, Navigator.push(
MaterialPageRoute( context,
builder: (context) => RegisterPage())); MaterialPageRoute(
}, child: const Text("点击注册")) builder: (context) => RegisterPage()));
},
child: const Text("点击注册"))
], ],
) )
], ],
@ -180,17 +182,17 @@ class _LoginPageState extends State<LoginPage> {
); );
} }
void submitFunction() async{ void submitFunction() async {
// 获取输入用户名密码 // 获取输入用户名密码
String userName = _userNameEditController.text; String userName = _userNameEditController.text;
String password = _passwordEditController.text; String password = _passwordEditController.text;
if(userName.trim().length != 11) { if (userName.trim().length != 11) {
Fluttertoast.showToast(msg: "请输入11位手机号"); Fluttertoast.showToast(msg: "请输入11位手机号");
return; return;
} }
if(password.trim().length < 5) { if (password.trim().length < 5) {
Fluttertoast.showToast(msg: "请输入5位以上密码"); Fluttertoast.showToast(msg: "请输入5位以上密码");
} }
@ -207,23 +209,20 @@ class _LoginPageState extends State<LoginPage> {
); );
if (responseInfo.success) { if (responseInfo.success) {
Map<String, dynamic> res = { Map<String, dynamic> res = {"token": responseInfo.token.toString()};
"token": responseInfo.token.toString() LoginBean loginBean = LoginBean.fromMap(res);
}; TokenHelper.getInstance.loginBean = loginBean;
LoginBean loginBean = LoginBean.fromMap(res); // 将token添加到状态管理器中
TokenHelper.getInstance.loginBean = loginBean; Provider.of<TokenProvider>(context, listen: false).setToken(loginBean);
Fluttertoast.showToast(msg: "登录成功");
Fluttertoast.showToast(msg: "登录成功");
//关闭当前页面
Navigator.of(context).pop(true);
//发送消息更新我的页面显示内容
loginStreamController.add(0);
//关闭当前页面
Navigator.of(context).pop(true);
//发送消息更新我的页面显示内容
// loginStreamController.add(0);
} else { } else {
//登录失败页面小提示 //登录失败页面小提示
Fluttertoast.showToast(msg: responseInfo.msg); Fluttertoast.showToast(msg: responseInfo.msg);
} }
} }
} }

View File

@ -1,9 +1,9 @@
import 'package:fengshui_compass/pages/personal_page.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../bottom_navigation_widget.dart'; import '../bottom_navigation_widget.dart';
import '../utils/navigator_utils.dart'; import '../states/token.dart';
import '../utils/token_helper.dart'; import '../utils/token_helper.dart';
// 用户未登录页面 // 用户未登录页面
@ -26,15 +26,21 @@ class _PersonalLoginPageState extends State<PersonalLoginPage> {
body: Container( body: Container(
width: double.infinity, width: double.infinity,
child: Column( child: Column(
children:[ children: [
Padding(padding: EdgeInsets.only(top: 80)), 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)), Padding(padding: EdgeInsets.only(top: 30)),
ListTile( ListTile(
title: Text("关于我们"), title: Text("关于我们"),
trailing: const Icon(Icons.arrow_forward_ios_sharp), trailing: const Icon(Icons.arrow_forward_ios_sharp),
leading: const Icon(Icons.account_circle), leading: const Icon(Icons.account_circle),
onTap: (){}, onTap: () {},
), ),
ListTile( ListTile(
title: Text("退出登陆"), title: Text("退出登陆"),
@ -43,7 +49,7 @@ class _PersonalLoginPageState extends State<PersonalLoginPage> {
onTap: () async { onTap: () async {
bool isExit = await showCupertinoDialog( bool isExit = await showCupertinoDialog(
context: context, context: context,
builder: (BuildContext context){ builder: (BuildContext context) {
return CupertinoAlertDialog( return CupertinoAlertDialog(
title: const Text("温馨提示"), title: const Text("温馨提示"),
content: Container( content: Container(
@ -69,11 +75,13 @@ class _PersonalLoginPageState extends State<PersonalLoginPage> {
if (isExit) { if (isExit) {
TokenHelper.getInstance.clear(); TokenHelper.getInstance.clear();
Navigator.of(context).push( //在状态管理器中清除token
MaterialPageRoute(builder: (context) { Provider.of<TokenProvider>(context, listen: false)
return BottomNavigationWidget(); .clearToken();
}) Navigator.of(context)
); .push(MaterialPageRoute(builder: (context) {
return BottomNavigationWidget();
}));
} }
}) })
], ],

View File

@ -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_login_page.dart';
import 'package:fengshui_compass/pages/personal_nologin_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/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../utils/token_helper.dart';
class PersonalPage extends StatefulWidget { class PersonalPage extends StatefulWidget {
const PersonalPage({Key key}) : super(key: key); const PersonalPage({Key key}) : super(key: key);
@ -14,29 +13,48 @@ class PersonalPage extends StatefulWidget {
} }
class _PersonalPageState extends State<PersonalPage> { class _PersonalPageState extends State<PersonalPage> {
@override // @override
void initState() { // void initState() {
super.initState(); // super.initState();
loginStreamController.stream.listen((event) { // loginStreamController.stream.listen((event) {
setState(() {}); // setState(() {});
}); // });
} // }
//
@override // @override
void dispose() { // void dispose() {
loginStreamController.close(); // loginStreamController.close();
super.dispose(); // super.dispose();
} // }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// 判断用户是否登陆 return Consumer<TokenProvider>(builder: (builder, tokenProvider, child) {
if (TokenHelper.getInstance.isLogin) { if (tokenProvider.isLogin) {
// 构建已登录页面 // 构建已登录页面
return PersonalLoginPage(); return PersonalLoginPage();
} else { } else {
// 构建未登录页面 // 构建未登录页面
return PersonalNoLoginPage(); return PersonalNoLoginPage();
} }
});
} }
} }
// );
//
// // 判断用户是否登陆
// if
//
// (
//
// TokenHelper.getInstance.isLogin
//
// ) {
// print(TokenHelper.getInstance.isLogin);
// // 构建已登录页面
// return PersonalLoginPage();
// } else {
// // 构建未登录页面
// return PersonalNoLoginPage();
// }
// }}

View File

@ -63,9 +63,17 @@ class RegionProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
// 覆盖临时的变量
resetTemp() async { resetTemp() async {
_tempProvinceName = _provinceName; _tempProvinceName = _provinceName;
_tempCityName = _cityName; _tempCityName = _cityName;
notifyListeners(); notifyListeners();
} }
// 将临时的省市名设为空
clearTemp() {
_tempProvinceName = '';
_tempCityName = '';
notifyListeners();
}
} }

33
lib/states/token.dart Normal file
View File

@ -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<String, dynamic> map = SPUtil.getObject("token_bean");
if (map != null) {
//加载缓存
_loginBean = LoginBean.fromMap(map);
}
notifyListeners();
}
clearToken() {
_loginBean = null;
notifyListeners();
}
setToken(LoginBean lb) {
_loginBean = lb;
notifyListeners();
}
}