1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/http#-installing-tab-”确认版本号后,将http(0.12.0或更高版本)添加到依赖项列表。
2、在Android Studio的编辑器视图中查看pubspec时,单击右上角的 Packages get,或者在命令行输入“flutter packages get”;这会将依赖包安装到您的项目。
3、运行以下代码
样例一
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
Future<Post> fetchPost() async {
final response =
await http.get('https://jsonplaceholder.typicode.com/posts/1');
final responseJson = json.decode(response.body);
return new Post.fromJson(responseJson);
}
class Post {
final int userId;
final int id;
final String title;
final String body;
Post({this.userId, this.id, this.title, this.body});
factory Post.fromJson(Map<String, dynamic> json) {
return new Post(
userId: json['userId'],
id: json['id'],
title: json['title'],
body: json['body'],
);
}
}
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Fetch Data Example',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new Scaffold(
appBar: new AppBar(
title: new Text('Fetch Data Example'),
),
body: new Center(
child: new FutureBuilder<Post>(
future: fetchPost(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return new Text(snapshot.data.title);
} else if (snapshot.hasError) {
return new Text("${snapshot.error}");
}
// By default, show a loading spinner
return new CircularProgressIndicator();
},
),
),
),
);
}
}
JSON请求样例片段代码
...
TextEditingController usernameController = new TextEditingController();
TextEditingController passwordController = new TextEditingController();
...
TextField(controller: usernameController),
TextField(controller: passwordController),
...
login(usernameController.text,passwordController.text).then((token){
print(token);
SharedPreferences.getInstance().then((prefs){
print(prefs.get("token"));
});
...
Future<dynamic> login(username,password) async{
var url = "http://192.168.3.4/login/auth";
// headers.append('Access-Control-Allow-Headers', 'Content-Type');
var map = new Map<String, dynamic>();
map["LoginName"]=username;
map["Password"]=password;
var response = await http.post(url,
headers: {HttpHeaders.contentTypeHeader: 'application/json'},
body:jsonEncode(map));
if (response.statusCode == 200) {
var jsonResponse = jsonDecode(response.body);
var ok = jsonResponse['ok'];
if(ok){
SharedPreferences prefs = await SharedPreferences.getInstance();
await prefs.setString('token', jsonResponse['token']);
return jsonResponse['token'];
}else{
print(jsonResponse['error']);
}
} else {
print("Request failed with status: ${response.statusCode}.");
}
}
...
JWT解析代码
Map<String, dynamic> parseJwt(String token) {
final parts = token.split('.');
if (parts.length != 3) {
throw Exception('invalid token');
}
final payload = _decodeBase64(parts[1]);
final payloadMap = json.decode(payload);
if (payloadMap is! Map<String, dynamic>) {
throw Exception('invalid payload');
}
return payloadMap;
}
String _decodeBase64(String str) {
String output = str.replaceAll('-', '+').replaceAll('_', '/');
switch (output.length % 4) {
case 0:
break;
case 2:
output += '==';
break;
case 3:
output += '=';
break;
default:
throw Exception('Illegal base64url string!"');
}
return utf8.decode(base64Url.decode(output));
}
持久化存储
1、pubspec文件管理Flutter应用程序的assets(资源,如图片、package等)。 在pubspec.yaml中,通过网址“https://pub.dartlang.org/packages/shared_preferences#-installing-tab-”确认版本号后,将shared_preferences(0.5.1+2或更高版本)添加到依赖项列表。
2、在Android Studio的编辑器视图中查看pubspec时,单击右上角的 Packages get,或者在命令行输入“flutter packages get”;这会将依赖包安装到您的项目。
3、 代码片段如下
import 'package:shared_preferences/shared_preferences.dart';
...
//存储token
SharedPreferences prefs = SharedPreferences.getInstance();
prefs.setInt('jwt', token);
...
//读取token
SharedPreferences.getInstance().then((prefs){
print(prefs.get("token"));
});
...
网友评论