profile_page.dart是主界面逻辑userAvatar是用户图像的数据,先判断数据是否是空,不为空就更新数据,为空就还是加载默认图片
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutterapp2/common/event_bus.dart';
import 'package:flutterapp2/constants/Constants.dart';
import 'package:flutterapp2/utils/data_utils.dart';
import 'package:flutterapp2/utils/net_utils.dart';
import 'login_web_page.dart';
/**
* 主界面My
*/
class ProfilePage extends StatefulWidget {
@override
_ProfilePageState createState() => _ProfilePageState();
}
class _ProfilePageState extends State<ProfilePage> {
List menuTitles = [
'我的消息',
'阅读记录',
'我的博客',
'我的问答',
'我的活动',
'我的团队',
'邀请好友',
];
List menuIcons = [
Icons.message,
Icons.print,
Icons.error,
Icons.phone,
Icons.send,
Icons.people,
Icons.person,
];
String userAvatar;
String userName;
@override
void initState() {
// TODO: implement initState
super.initState();
//尝试显示用户信息
_showUerInfo();
eventBus.on<LoginEvent>().listen((event) {
//TODO
//获取用户信息并显示
_getUerInfo();
});
eventBus.on<LogoutEvent>().listen((event) {
//TODO
});
}
_getUerInfo() {
DataUtils.getAccessToken().then((accessToken){
if (accessToken == null || accessToken.length == 0) {
return;
}
Map<String, dynamic> params = Map<String, dynamic>();
params['access_token'] = accessToken;
params['dataType'] = 'json';
print('Debug accessToken: $accessToken');
NetUtils.get(AppUrls.OPENAPI_USER, params).then((data) {
//{"gender":"male","name":"Damon2019","location":"湖南 长沙","id":2006874,"avatar":"https://oscimg.oschina.net/oscnet/up-21zvuaor7bbvi8h2a4g93iv9vve2wrnz.jpg!/both/50x50?t=1554975223000","email":"3262663349@qq.com","url":"https://my.oschina.net/damon007"}
//data: {"gender":"male","name":"Augfun","location":"广东 深圳","id":4571926,"avatar":"https://static.oschina.net/uploads/user/2285/4571926_50.jpg?t=1593452705000","email":"1234556@outlook.com","url":"https://my.oschina.net/u/4571926"}
print('Debug data: $data');
//解析数据
Map<String, dynamic> map = json.decode(data);
if (mounted) {
setState(() {
userAvatar = map['avatar'];
userName = map['name'];
});
}
DataUtils.saveUserInfo(map);
});
});
}
_showUerInfo() {
}
@override
Widget build(BuildContext context) {
return ListView.separated(
itemBuilder: (context, index) {
//My界面的头部
if(index == 0){
//头像用Container装起来
return _buildHeader();
}
index -= 1;
return ListTile(
leading: Icon(menuIcons[index]),
title: Text(menuTitles[index]),
trailing: Icon(Icons.arrow_forward_ios),//尾巴
onTap: () {
_login();
},
);
},
//分割线
separatorBuilder: (context, index) {
return Divider();
},
itemCount: menuTitles.length + 1
);
}
_login() async {
final result = await Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => LoginWebPage()));
if (result != null && result == 'refresh') {
print('Debug profile page LoginEvent');
//登录成功
eventBus.fire(LoginEvent());
}
}
Container _buildHeader() {
return Container(
height: 150.0,
color: Color(AppColors.APP_THEME),
//头像的布局填充
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GestureDetector(
//先判断网路图片是否为空
child: userAvatar != null
? Container(
width: 60.0,
height: 60.0,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: Color(0xffffffff),
width: 2.0,
),
image: DecorationImage(
//加载网路图片
image: NetworkImage(userAvatar),
fit: BoxFit.cover,
),
),
)
//加载网路图片
: Image.asset('assets/images/ic_avatar_default.png',
width: 60.0,
height: 60.0,
),
onTap: () {
//执行登录
_login();
},
),
SizedBox(
),
Text(
'点击头像登录',
style: TextStyle(color: Color(0xffffffff)),
),
],
),
),
);
}
}
data_utils.dart保存用户的信息数据
import 'package:flutterapp2/models/user.dart';
import 'package:shared_preferences/shared_preferences.dart';
class DataUtils{
static const String SP_ACCESS_TOKEN = 'access_token';
static const String SP_REFRESH_TOKEN = 'refresh_token';
static const String SP_UID = 'uid';
static const String SP_TOKEN_TYPE = 'token_type';
static const String SP_EXPIRES_IN = 'expires_in';
static const String SP_IS_LOGIN = 'is_login';
//用户信息字段
static const String SP_USER_GENDER = 'gender';
static const String SP_USER_NAME = 'name';
static const String SP_USER_LOCATION = 'location';
static const String SP_USER_ID = 'id';
static const String SP_USER_AVATAR = 'avatar';
static const String SP_USER_EMAIL = 'email';
static const String SP_USER_URL = 'url';
//存储数据
// {"access_token":"aa105aaf-ca4f-4458-822d-1ae6a1fa33f9","refresh_token":"daae8b80-3ca6-4514-a8ae-acb3a82c951c","uid":2006874,"token_type":"bearer","expires_in":510070}
static Future<void> saveLoginInfo(Map<String, dynamic> map) async {
if (map != null && map.isNotEmpty) {
SharedPreferences sp = await SharedPreferences.getInstance();
sp
..setString(SP_ACCESS_TOKEN, map[SP_ACCESS_TOKEN])
..setString(SP_REFRESH_TOKEN, map[SP_REFRESH_TOKEN])
..setInt(SP_UID, map[SP_UID])
..setString(SP_TOKEN_TYPE, map[SP_TOKEN_TYPE])
..setInt(SP_EXPIRES_IN, map[SP_EXPIRES_IN])
..setBool(SP_IS_LOGIN, true);
}
}
//清楚登陆数据
static Future<void> clearLoginInfo() async {
SharedPreferences sp = await SharedPreferences.getInstance();
sp
..setString(SP_ACCESS_TOKEN, '')
..setString(SP_REFRESH_TOKEN, '')
..setInt(SP_UID, -1)
..setString(SP_TOKEN_TYPE, '')
..setInt(SP_EXPIRES_IN, -1)
..setBool(SP_IS_LOGIN, false);
}
//是否登录
static Future<bool> isLogin() async {
SharedPreferences sp = await SharedPreferences.getInstance();
bool isLogin = sp.getBool(SP_IS_LOGIN);
return isLogin != null && isLogin;
}
//获取token
static Future<String> getAccessToken() async {
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getString(SP_ACCESS_TOKEN);
}
//{"gender":"male","name":"Damon2019","location":"湖南 长沙","id":2006874,"avatar":"https://oscimg.oschina.net/oscnet/up-21zvuaor7bbvi8h2a4g93iv9vve2wrnz.jpg!/both/50x50?t=1554975223000","email":"3262663349@qq.com","url":"https://my.oschina.net/damon007"}
//data: {"gender":"male","name":"Augfun","location":"广东 深圳","id":4571926,"avatar":"https://static.oschina.net/uploads/user/2285/4571926_50.jpg?t=1593452705000","email":"123456@outlook.com","url":"https://my.oschina.net/u/4571926"}
//保存用户的信息
static saveUserInfo(Map<String, dynamic> map) async {
if (map != null && map.isNotEmpty) {
SharedPreferences sp = await SharedPreferences.getInstance();
String gender = map[SP_USER_GENDER];
String name = map[SP_USER_NAME];
String location = map[SP_USER_LOCATION];
int id = map[SP_USER_ID];
String avatar = map[SP_USER_AVATAR];
String email = map[SP_USER_EMAIL];
String url = map[SP_USER_URL];
sp
..setString(SP_USER_GENDER, gender)
..setString(SP_USER_NAME, name)
..setString(SP_USER_LOCATION, location)
..setInt(SP_USER_ID, id)
..setString(SP_USER_AVATAR, avatar)
..setString(SP_USER_EMAIL, email)
..setString(SP_USER_URL, url);
User user = new User(
id: id,
name: name,
gender: gender,
avatar: avatar,
email: email,
location: location,
url: url);
return user;
}
return null;
}
}
Flutter的bean数据
user.dart
// 用户基本信息
class User {
String gender;
String name;
String location;
int id;
String avatar;
String email;
String url;
User(
{this.gender,
this.name,
this.location,
this.id,
this.avatar,
this.email,
this.url});
}