logo头像
Snippet 博客主题

Flutter app 2.save session

Flutter app 2.save session

本地保存 方式 使用shared_preferences

参考

https://flutter.io/cookbook/persistence/key-value/

1. Add the dependency 添加依赖

https://pub.dartlang.org/

中查找最新版本

Add this to your package’s pubspec.yaml file:

1
2
dependencies:
shared_preferences: ^0.4.2

更新

flutter packages get

2. 使用 shared_preferences 保存

引入

1
import 'package:shared_preferences/shared_preferences.dart';

创建 util/DataUtils.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';

class DataUtils {
static final String SP_SESSION = "SESSION";

static Future<String> getAccessToken() async {
SharedPreferences sp = await SharedPreferences.getInstance();
return sp.getString(SP_SESSION);
}

static Future<bool> setAccessToken(String session) async {
SharedPreferences sp = await SharedPreferences.getInstance();
return await sp.setString(SP_USER_NAME, session);
}
}

3. LoginPage.dart 中使用 保存用户信息 以及session

1. 登陆完成保存 session

创建单例 保存 app 缓存数据 session

/helper/DataHelper.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import 'package:flutter_snap/util/DataUtils.dart';

class DataHelper {
static final DataHelper _singleton = new DataHelper._internal();

factory DataHelper() {
return _singleton;
}

DataHelper._internal();

String session;

void setSession(String session){
print(session);

if (session != this.session){
this.session = session ;
var result = DataUtils.setAccessToken(session);
print("setSession");

print(result);

}
}

String getSession(){
if (null == this.session){
var jsession = DataUtils.getAccessToken();

print("getSession");

print(jsession);

this.session = jsession.toString();
}
return session ;
}
}

LoginPage.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
showTips() async {
//TODO loading
setState( () {
_isLoading = true;
},
);

Map map = {
'user': 'las@sengled.com',
'pwd': '123456',
'osType':'android',
'uuid':'4CC09670-0623-497B-AB82-F48611FA4C42',
'appCode':'snap',
'productCode':'snap'
};

print(Api.AuthenCross);
print(json.encode(map));

String result = await apiRequest(Api.AuthenCross, map);

Map<String, dynamic> resultMap = json.decode(result);


if( null != resultMap ){

if( 0 == resultMap['ret'] || "success" == resultMap['msg']){
var jsessionId = resultMap['jsessionId'];

print(jsessionId) ;
if( jsessionId.length > 0 ){
new DataHelper().setSession(jsessionId);
}

getUserInfo();

} else {

}

}
}

LoginPage login 调用DataHelper 保存 session
在 调用 getUserInfo 获取用户信息

2. 获取用户信息 在 head 中添加 session

http 代码

util/NetUtils.dart

http headers 添加 session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class NetUtils {


static Future<String> apiRequest(String url, Map jsonMap) async {
String session = new DataHelper().getSession();
print(session);
print(url);
print(json.encode(jsonMap));

HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.postUrl(Uri.parse(url));
request.headers.set('content-type', 'application/json');
if (null != session){
request.headers.add('Cookie', 'JSESSIONID=' + session.toString());
}

request.add(utf8.encode(json.encode(jsonMap)));
HttpClientResponse response = await request.close();
// todo - you should check the response.statusCode
String reply = await response.transform(utf8.decoder).join();
httpClient.close();
return reply;
}
}

LoginPage.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Future getUserInfo() async {
Map map = {};
String result = await NetUtils.apiRequest(Api.getUserInfo, map);
Map<String, dynamic> resultMap = json.decode(result);
print(resultMap);
if( null != resultMap ){
if( 200 == resultMap['messageCode'] || "ok" == resultMap['message']){
var data = resultMap['data'];
if ( null != data ){
num id = data['id'];
var account = data['account'];
var nickName = data['nickName'];
var profile = data['profile'];
User userInfo = new User(
id:id,
name:nickName,
avatar:profile,
account:account);

new UserHelper().setUser(userInfo) ;
DataUtils.saveUserInfo(userInfo);
}


} else {

}

}

}

model/User.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class User {
num id;
String account;
String name;
String avatar;

User( {this.id, this.name, this.avatar, this.account} );

User.fromJson(Map<String, dynamic> json)
: id = json['id'],
account = json['account'],
name = json['name'],
avatar = json['avatar'] ;

Map<String, dynamic> toJson() =>
{
'id': id,
'account': account,
'name': name,
'avatar': avatar,
};
}

helper/UserHelper.dart

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class UserHelper {
static final UserHelper _singleton = new UserHelper._internal();
factory UserHelper() {
return _singleton;
}

UserHelper._internal();
User user;

setUser(User u){
this.user = u;
}

User getUser(){
return user;
}
}

总结

  1. shared_preferences 存储
  2. http请求 添加 session
支付宝打赏 微信打赏

打赏