跳至主要內容

存储

Emilia Zhen大约 3 分钟flutter

Dio

Dio是一个强大的Dart Http请求库,支持Restful APIFormData拦截器请求取消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 状态管理

  1. 创建Provide,这个类似于创建一个state,为了区分,新建文件夹provide,创建counter.dart 混入ChangeNotifier,意思是可以不用管理听众;通过notifyListeners可以通知听众刷新
import 'package:flutter/material.dart';
class Counter with ChangeNotifier{
    int value = 0;
    increment(){
       value++;
       notifyListeners();
   }
}
  1. 将状态放入顶层,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,
      )
   );
}
  1. 获取、修改状态
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();