存储
大约 3 分钟
Dio
Dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时和定义适配器等
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
class PageHome extends StatelessWidget {
void getHttp() async{
try {
Response res;
res = await Dio().get('https://www.xxx?name=002');
// res = await Dio().post('https://xx',queryParameters:{'name':002});
print(res);
} catch (e) {
}
}
@override
Widget build(BuildContext context) {
getHttp();
return Scaffold(
body: Center(
child: Text('首页'),
),
);
}
}
伪造请求头
在lib下新建文件夹config,并新建文件httpHeaders.dart
const httpHeaders = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/json',
...
};
dio.options.headers = httpHeaders;
FutureBuilder 部件
Flutter内置部件,用来等待异步请求的,有了这个部件就没必要再用initState了
import 'dart:convert';
class _PageHomeState extends State<PageHome> {
@override
Widget build(BuildContext context) {
return Container(
child: Scaffold(
appBar: AppBar(title: Text('LifeShop+'),),
body: FutureBuilder(
future: getHomePageContent(),
builder: (context,snapshot){
if(snapshot.hasData){
var data = json.decode(snapshot.data.toString());
List<Map> swiperDataList = (data['data']['slides'] as List).cast();
List<Map> navigatorList = (data['data']['category'] as List).cast();
if(navigatorList.length > 10){
navigatorList.removeRange(10, navigatorList.length);
}
return Column(
children: <Widget>[
SwiperDiy(swiperDataList: swiperDataList),
TopNavigator(navigatorList: navigatorList)
],
);
} else {
return Center(child: Text('加载中...'));
}
},
)
),
);
}
}
provide 状态管理
- 创建
Provide,这个类似于创建一个state,为了区分,新建文件夹provide,创建counter.dart混入ChangeNotifier,意思是可以不用管理听众;通过notifyListeners可以通知听众刷新
import 'package:flutter/material.dart';
class Counter with ChangeNotifier{
int value = 0;
increment(){
value++;
notifyListeners();
}
}
- 将状态放入顶层,
ProviderNode封装了InheritWidget,并提供了一个providers容器用于放置状态
import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
import './provide/counter.dart';
void main(){
var counter = Counter();
var providers = Providers();
providers..provide(Provider<Counter>.value(counter));
runApp(
ProviderNode(
child: MyApp(),
providers: providers,
)
);
}
- 获取、修改状态
import 'package:flutter/material.dart';
import 'package:provide/provide.dart';
import '../provide/counter.dart';
class PageCart extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
children: <Widget>[
Provide<Counter>(
builder: (context,child,counter){
return Text('${counter.value}');
},
),
RaisedButton(
onPressed: (){
Provide.value<Counter>(context).increment();
},
child: Text('+1'),
)
],
),
),
);
}
}
持久化 shared_perferences
用key-value的形式来进行APP客户端的持久化
import 'package:shared_preferences/shared_preferences.dart';
_incrementCounter() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
int counter = (prefs.getInt('counter') ?? 0) + 1;
print('Pressed $counter times.');
await prefs.setInt('counter', counter);
// prefs.remove('counter');
// prefs.clear();
}
系统权限
import 'package:connectivity/connectivity.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:saas/utils/dialog.dart';
class SystemOptions {
/// 写入外部存储,检测权限状态,同意则写入 callBack 回调函数
static Future requestPermission(context, {callBack}) async {
PermissionStatus permission = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.storage);
if (permission == PermissionStatus.granted) {
callBack();
} else {
await PermissionHandler().requestPermissions([PermissionGroup.storage]);
PermissionStatus permission = await PermissionHandler()
.checkPermissionStatus(PermissionGroup.storage);
if (permission == PermissionStatus.granted) {
callBack();
} else {
UtilDialog.showMessage(context, "您拒绝读写权限,系统的部分功能将受到影响!");
}
}
}
///网络是否连接 true 网络连接良好
static Future<bool> isNetConnectivity() async {
ConnectivityResult connectivityResult =
await (Connectivity().checkConnectivity()); //无网络状态
return connectivityResult != ConnectivityResult.none;
}
///获取网络类型
static Future<ConnectivityResult> getConnectivityType() async {
ConnectivityResult connectivityResult =
await (Connectivity().checkConnectivity()); //无网络状态
return connectivityResult;
}
/// 申请相机或者相册权限
static void requestImagePermission(context, ImageSource source, {callBack}) {
PermissionGroup requestPermission = source == ImageSource.camera
? PermissionGroup.camera
: PermissionGroup.photos;
PermissionHandler().checkPermissionStatus(requestPermission).then((values) {
if (values == PermissionStatus.granted) {
callBack();
} else {
PermissionHandler().requestPermissions([requestPermission]).then((res) {
if (res[requestPermission] == PermissionStatus.granted) {
callBack();
} else {
UtilDialog.showMessage(context,
'您拒绝了使用${source == ImageSource.camera ? "相机" : "照片"}权限,请“设置-隐私-${source == ImageSource.camera ? "相机" : "照片"}”选中项,允许智慧金店访问你的${source == ImageSource.camera ? "相机" : "照片"}');
}
});
}
});
}
}
websocket
websocket是一种双工的通行协议,不同于http单工的协议,websocket相当于建立了一条长的TCP链接在服务端和客户端之间,使得服务端和客户端可以实时通行,而不需要通过http轮训的方式来间隔的获取消息
import 'package:web_socket_channel/io.dart';
IOWebSocketChannel channel;
Map<String, dynamic> headers = new Map();
headers['origin'] = 'https://x.xx.com'; // 加上一个origin,防止被拦截
channel = IOWebSocketChannel.connect(
'wss://x.xx.com:443/ws/',
// 可以设置请求头
headers: headers
);
// 监听消息,如果有消息到来,就打印出来
channel.stream.listen((message) {
print(message);
final Map<String, dynamic> mesData = json.decode(message.toString()); // 返回的消息是String类型的,可以自己decode一些成为map类型
setState(() {
text = mesData.text;
});
});
实现消息的发送和接收同时更新UI
channel.slink.add('xxxx'); // 将消息加入到通道中,websocket会进行发送操作
卸载组件是需要Close掉链接
channel.sink.close();
