hyzp_ybqx-Commit001:代码刚转换好,编译通过

This commit is contained in:
WinUser01
2021-12-09 20:24:36 +08:00
commit 8c74b14e5c
800 changed files with 66912 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
import 'dart:convert';
import 'package:encrypt/encrypt.dart';
class EncryptUtil {
static const List<int> intList16 = [
3,
8,
7,
8,
3,
7,
8,
9,
1,
8,
6,
8,
2,
8,
7,
8
];
//aes加密
static String aesEncode0(String content) {
try {
final key = Key.fromBase64(base64Encode(intList16));
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
final encrypted =
encrypter.encrypt(content, iv: IV.fromBase64(base64Encode(intList16)));
return encrypted.base64;
} catch (err) {
print("aes encode error:$err");
return content;
}
}
//aes加密
static String aesEncode(String content) {
try {
final key = Key.fromBase64(base64Encode(intList16));
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
final encrypted =
encrypter.encrypt(content, iv: IV.fromBase64(base64Encode(intList16)));
return encrypted.base64;
} catch (err) {
print("aes encode error:$err");
return content;
}
}
//aes解密
static String aesDecode(String base64) {
try {
final key = Key.fromBase64(base64Encode(intList16));
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
return encrypter.decrypt64(base64,
iv: IV.fromBase64(base64Encode(intList16)));
} catch (err) {
print("aes decode error:$err");
return base64;
}
}
//aes解密-dynamic
static dynamic aesDecodeDynamic(dynamic base64) {
try {
final key = Key.fromBase64(base64Encode(intList16));
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
return encrypter.decrypt64(base64,
iv: IV.fromBase64(base64Encode(intList16)));
} catch (err) {
print("aes decode error:$err");
return base64;
}
}
}
+150
View File
@@ -0,0 +1,150 @@
import 'package:flutter/cupertino.dart';
void segmentPrint(String msg, {int len = 600}) {
var outStr = StringBuffer();
for (var index = 0; index < msg.length; index++) {
outStr.write(msg[index]);
if (index % len == 0 && index != 0) {
print(outStr);
outStr.clear();
var lastIndex = index + 1;
if (msg.length - lastIndex < len) {
var remainderStr = msg.substring(lastIndex, msg.length);
print(remainderStr);
break;
}
}
}
}
// ///是否在生产环境
// ///const bool isDebug = !const bool.fromEnvironment("dart.vm.product");
//
// //参数可选 isDebug默认true limitLength默认800
// LogUtil.init(title: "来自LogUtil", isDebug: isDebug,limitLength:800);
//
// var log = "我是日志";
// //仅在Debug时打印
// LogUtil.d(log);
// LogUtil.d("我是日志");
//
// //在所有环境中打印
// LogUtil.v(log);
// LogUtil.v("我是日志");
// ————————————————
// 版权声明:本文为CSDN博主「懒散的阿乐」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/zylvip/article/details/102608256
class LogUtil {
static var _separator = "=";
static var _split =
"$_separator$_separator$_separator$_separator$_separator$_separator$_separator$_separator$_separator";
static var _title = "Yl-Log";
static var _isDebug = true;
static int _limitLength = 1200;
static String _startLine = "$_split$_title$_split";
static String _endLine = "$_split$_separator$_separator$_separator$_split";
static void init({String title, @required bool isDebug, int limitLength}) {
_title = title;
_isDebug = isDebug;
_limitLength = limitLength ??= _limitLength;
_startLine = "$_split$_title$_split";
var endLineStr = StringBuffer();
var cnCharReg = RegExp("[\u4e00-\u9fa5]");
for (int i = 0; i < _startLine.length; i++) {
if (cnCharReg.stringMatch(_startLine[i]) != null) {
endLineStr.write(_separator);
}
endLineStr.write(_separator);
}
_endLine = endLineStr.toString();
}
//仅Debug模式可见
static void d(dynamic obj) {
if (_isDebug) {
_log(obj.toString());
}
}
static void v(dynamic obj) {
_log(obj.toString());
}
static void _log(String msg) {
print("$_startLine");
_logEmpyLine();
if (msg.length < _limitLength) {
print(msg);
} else {
segmentationLog(msg);
}
_logEmpyLine();
print("$_endLine");
}
static void segmentationLog(String msg) {
var outStr = StringBuffer();
for (var index = 0; index < msg.length; index++) {
outStr.write(msg[index]);
if (index % _limitLength == 0 && index != 0) {
print(outStr);
outStr.clear();
var lastIndex = index + 1;
if (msg.length - lastIndex < _limitLength) {
var remainderStr = msg.substring(lastIndex, msg.length);
print(remainderStr);
break;
}
}
}
}
static void _logEmpyLine() {
print("");
}
}
//common_utils 工具类已经将pring 封装为工具类
//
// common_utils: ^1.1.1
// 使用common_utils工具类中的LogUtil
//
// //初始化设置 LogUtil
// LogUtil.init(true);
// //输出日志
// LogUtil.v("test");
// 当然 LogUtil 的 init 方法可根据是否是生产环境来配置 true 与 false ,如果是 false ,则不输出日志,这样的一个优化也是应用在发版本后可以节省向控制台输出日志信息的消耗。
//
// 封装源码如下
class LogUtil2 {
static const String _TAG_DEF = "###common_utils###";
static bool debuggable = false; //是否是debug模式,true: log v 不输出.
static String TAG = _TAG_DEF;
static void init({bool isDebug = false, String tag = _TAG_DEF}) {
debuggable = isDebug;
TAG = tag;
}
static void e(Object object, {String tag}) {
_printLog(tag, ' e ', object);
}
static void v(Object object, {String tag}) {
if (debuggable) {
_printLog(tag, ' v ', object);
}
}
static void _printLog(String tag, String stag, Object object) {
StringBuffer sb = new StringBuffer();
sb.write((tag == null || tag.isEmpty) ? TAG : tag);
sb.write(stag);
sb.write(object);
print(sb.toString());
}
}
+549
View File
@@ -0,0 +1,549 @@
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hyzp_ybqx/config/service_url.dart';
import 'package:hyzp_ybqx/services/EventBus.dart';
import 'commonFun.dart';
///用户权限管理
// static const String getUserAccessUrl = ServiceUrl + '?s=App.User_User.GetAccess'; //1、根据用户ID获取用户所属角色
// static const String getUserGroupUrl = ServiceUrl + '?s=App.User_User.GetGroup'; //2、获取后台用户角色分组数据
// static const String getUserGroupListUrl = ServiceUrl + '?s=App.User_User.GetGroupList'; //3、获取后台用户角色分组分页列表数据
// static const String getUserAuthUrl = ServiceUrl + '?s=App.User_User.GetAuth'; //4、获取后台功能分类数据
// static const String getUserAuthListUrl = ServiceUrl + '?s=App.User_User.GetAuthList'; //5、获取后台功能分类分页列表数据
//2.2、获取后台用户全部角色分组数据
Future getUserGroupAll({int user_id = -1}) async {
if (user_id < 0) {
user_id = g_userInfo.mapUserInfo['user_id'];
}
//1、根据用户ID获取用户所属角色(用户组)
getUserAccess(user_id: user_id).then((value) {
// I/flutter (15540): g_userInfo.userGroupIDlist = [31, 27]
int len = g_userInfo.userGroupIDlist.length;
for (int i = 0; i < len; i++) {
getUserGroup(group_id: g_userInfo.userGroupIDlist[i]);
}
print('g_userInfo.userRulesMap = ${g_userInfo.userRulesMap}');
});
}
//2.1、获取后台用户指定 group_id 角色分组数据
Future getUserGroup({@required int group_id}) async {
var api = ServicePath.getUserGroupUrl;
print(api);
//I/flutter (15540): http://125.64.218.67:9904/?s=App.User_User.GetGroup
String random = RandomBit(6);
Map map = {
'random': random,
'sign': GenerateMd5(APPkey + random),
'id': group_id,
};
print('开始处理登录请求...');
Response response;
Dio dio = Dio();
//返回结果
// 返回字段 类型 说明
// id 整型 角色分组ID
// type 整型 角色分组类型:1普通角色
// level 整型 角色分组级次(1-顶级,2-次级)
// pid 整型 上级角色分组ID(为0则表示为顶级)
// rules 字符串 授权功能ID(如:5,7,112,331),表示此角色拥有相应ID的功能权限
//{
// "ret": 200,
// "data": {
// "id": 31,
// "jgid": 2,
// "type": 0,
// "title": "监控室",
// "level": 0,
// "pid": 0,
// "sort": 2,
// "status": 1,
// "rules": ""
// },
// "msg": ""
// }
try {
print('response = ${response}');
// I/flutter (15540): response = null
response = await dio.post(api, data: map);
print('response = ${response}');
//I/flutter (15540): response = {"ret":200,"data":{"id":31,"jgid":2,"type":0,"title":"监控室","level":0,"pid":0,"sort":2,"status":1,"rules":""},"msg":""}
if (response.statusCode == 200) {
Map _mapRet = await getMapFromJson(response.data);
print('_mapRet = ${_mapRet}');
// I/flutter (15540): _mapRet = {ret: 200, data: {id: 31, jgid: 2, type: 0, title: 监控室, level: 0, pid: 0, sort: 2, status: 1, rules: }, msg: }
//print('_mapRet[\'data\']["rules"] is a = ${_mapRet['data']["rules"] is String}');
//_mapRet['data']["rules"] is a = true
//I/flutter (15540): _mapRet = {ret: 200, data: false, msg: }
//I/flutter (15540): 网络请求过程异常e = NoSuchMethodError: Class 'bool' has no instance method '[]'.
if (_mapRet['data'] is Map) {
String _rules = _mapRet['data']["rules"].trim();
//print('_rules = ${_rules}');
print('_rules.length = ${_rules.length}');
//_rules.length = 0
List<int> _list = [];
if (_rules.isNotEmpty) {
List _list2 = _rules.split(',');
print('_list2 = $_list2');
//I/flutter (15540): _list2 = [1968, 1972, 1973, 1969, 1976, 1977, 2008, 2009, 2011, 2014,
// 2015, 2018, 2029, 2030, 2031, 2054, 2055, 2035, 2036, 2037, 2041, 2042, 2043, 2047, 2048,
// 2049, 2053, 1970, 1980, 1981, 1971, 1984, 1985, 1992, 1993, 2000, 2001, 2020, 2022]
int len = _list2.length;
List<int> _list3 = [];
for (int i = 0; i < len; i++) {
_list3.add(int.parse(_list2[i].trim()));
}
_list = _list3;
}
print('_list = $_list');
//I/flutter (15540): _list = [{uid: 135, group_id: 31}, {uid: 135, group_id: 27}]
g_userInfo.userRulesMap[_mapRet['data']['id']] = _list;
print('g_userInfo.userRulesMap = ${g_userInfo.userRulesMap}');
// I/flutter (15540): g_userInfo.userGroupIDlist = [31, 27]
} else {
print('获取数据失败!');
}
print('网络请求过程正常完成');
} else {
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
}
} catch (e) {
print('网络请求过程异常e = ${e}');
Fluttertoast.showToast(
msg: 'ERROR:======>${e}',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
}
//1、根据用户ID获取用户所属角色(用户组)
Future getUserAccess({int user_id = -1}) async {
if (user_id < 0) {
user_id = g_userInfo.mapUserInfo['user_id'];
}
var api = ServicePath.getUserAccessUrl;
print(api);
//I/flutter (15540): http://125.64.218.67:9904/?s=App.User_User.GetAccess
String random = RandomBit(6);
Map map = {
'random': random,
'sign': GenerateMd5(APPkey + random),
'uid': user_id,
};
print('开始处理登录请求...');
Response response;
Dio dio = Dio();
//{
// "ret": 200,
// "data": [
// {
// "uid": 136,
// "group_id": 32
// },
// {
// "uid": 136,
// "group_id": 33
// }
// ],
// "msg": ""
// }
try {
print('response = ${response}');
// I/flutter (15540): response = null
response = await dio.post(api, data: map);
print('response = ${response}');
// I/flutter (15540): response = {"ret":200,"data":[{"uid":135,"group_id":31},{"uid":135,"group_id":27}],"msg":""}
if (response.statusCode == 200) {
Map _mapRet = await getMapFromJson(response.data);
print('_mapRet = ${_mapRet}');
// I/flutter (15540): _mapRet = {ret: 200, data: [{uid: 135, group_id: 31}, {uid: 135, group_id: 27}], msg: }
List _list = _mapRet['data'];
print('_list = $_list');
//I/flutter (15540): _list = []
if (_list.isNotEmpty) {
g_userInfo.userGroupIDlist.clear();
int len = _list.length;
for (int i = 0; i < len; i++) {
g_userInfo.userGroupIDlist.add(_list[i]["group_id"]);
eventBus.fire(GroupIdUpdateEvent('g_userInfo.userGroupIDlist 数据已更新')); //这样刷新有效
}
}
print('g_userInfo.userGroupIDlist = ${g_userInfo.userGroupIDlist}');
//I/flutter (15540): g_userInfo.userRulesMap = {31: []}
print('网络请求过程正常完成');
} else {
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
}
} catch (e) {
print('网络请求过程异常e = ${e}');
Fluttertoast.showToast(
msg: 'ERROR:======>${e}',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
}
//3、获取后台用户角色分组分页列表数据 ServicePath.getUserGroupListUrl
//5、获取后台功能分类分页列表数据 ServicePath.getUserAuthListUrl
//x、获取后台 x 分类分页列表数据
// int pages 为获取的页数, -1 为 All;int perpage 为每页记录数
// 返回:
// mapRecordList = {
// 'mapRecordListRet': {},
// 'listRecordList': [],
// };
Future getRecordList({@required String api, int pages = 3, int perpage = 20}) async {
print(api);
int _total = 0; //第一页时保存数据库中记录总数
int _counter = 0; //已读取的记录数计数器
int _page = 0;
String random = RandomBit(6);
Map map = {
'random': random,
'sign': GenerateMd5(APPkey + random),
'page': _page,
'perpage': perpage,
};
print('开始处理登录请求...');
Response response;
Dio dio = Dio();
Map mapRecordList = {
'mapRecordListRet': {},
'listRecordList': [],
};
try {
while (pages < 0 ? true : _page < pages) {
map['page']++;
response = await dio.post(api, data: map);
print('response = ${response.toString()}');
if (response.statusCode == 200) {
mapRecordList['mapRecordListRet'] = await getMapFromJson(response.data);
print('mapRecordList[\'mapRecordListRet\'] = ${mapRecordList['mapRecordListRet']}');
//第一页时保存数据库中记录总数
if (1 == map['page']) {
_total = mapRecordList['mapRecordListRet']['data']['total'];
}
mapRecordList['listRecordList'].addAll(mapRecordList['mapRecordListRet']['data']['items']);
//print('mapRecordList[\'listRecordList\'] = ${mapRecordList['listRecordList']}');
print('map[\'page\'] = ${map['page']}');
_counter = mapRecordList['listRecordList'].length; //已读取的记录数计数器
print('_counter = $_counter');
//I/flutter (23648): _counter = 8
print('_total = $_total');
// I/flutter (23648): _total = 8
//已读取的记录数计数器,超过或等于数据库中记录总数时,则终止循环
if (_counter >= _total) {
return mapRecordList;
}
print('第 ${map['page']} 次网络请求过程正常完成');
} else {
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
}
}
} catch (e) {
print('网络请求过程异常e = ${e}');
Fluttertoast.showToast(
msg: 'ERROR:======>${e}',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
return mapRecordList;
}
Map mapUserGroupList = {
'mapRecordListRet': {
"ret": 200,
"data": {
"items": [
{
"id": 35,
"jgid": 2,
"type": 0,
"title": "局领导",
"level": 0,
"pid": 0,
"sort": 1,
"status": 1,
"rules": ""
},
{
"id": 34,
"jgid": 2,
"type": 0,
"title": "系统管理",
"level": 0,
"pid": 0,
"sort": 1,
"status": 1,
"rules": ""
},
{
"id": 33,
"jgid": 2,
"type": 1,
"title": "参观者",
"level": 0,
"pid": 0,
"sort": 4,
"status": 1,
"rules":
"1968,1972,1973,1969,1976,1977,2008,2009,2011,2014,2015,2018,2029,2030,2031,2054,2055,2035,2036,2037,2041,2042,2043,2047,2048,2049,2053,1970,1980,1981,1971,1984,1985,1992,1993,2000,2001,2019,2020,2022"
},
{
"id": 32,
"jgid": 2,
"type": 0,
"title": "演示账户",
"level": 0,
"pid": 0,
"sort": 3,
"status": 1,
"rules":
"1968,1972,1973,1969,1976,1977,2008,2009,2011,2014,2015,2018,2029,2030,2031,2054,2055,2035,2036,2037,2041,2042,2043,2047,2048,2049,2053,1970,1980,1981,1971,1984,1985,1992,1993,2000,2001,2020,2022"
},
{
"id": 31,
"jgid": 2,
"type": 0,
"title": "监控室",
"level": 0,
"pid": 0,
"sort": 2,
"status": 1,
"rules": ""
},
{
"id": 30,
"jgid": 2,
"type": 0,
"title": "中心领导",
"level": 0,
"pid": 0,
"sort": 1,
"status": 1,
"rules":
"1968,1972,1973,1974,1975,1969,1976,1977,1978,1979,1970,1980,1981,1982,1983,1971,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007"
},
{
"id": 28,
"jgid": 2,
"type": 1,
"title": "审核操作员",
"level": 0,
"pid": 0,
"sort": 3,
"status": 1,
"rules":
"1968,1972,1973,1974,1975,1969,1976,1977,1978,1979,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2029,2030,2031,2054,2055,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,1970,1980,1981,1982,1983"
},
{
"id": 26,
"jgid": 2,
"type": 1,
"title": "管理员",
"level": 0,
"pid": 0,
"sort": 2,
"status": 1,
"rules":
"1968,1972,1973,1974,1975,1969,1976,1977,1978,1979,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2029,2030,2031,2054,2055,2032,2033,2034,2035,2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049,2050,2051,2052,2053,1970,1980,1981,1982,1983,1971,1984,1985,1986,1987,1988,1989,1990,1991,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028"
}
],
"total": 8,
"page": 1,
"perpage": 20
},
"msg": ""
},
'listRecordList': [],
};
Map mapUserAuthList = {
'mapRecordListRet': {},
'listRecordList': [],
};
Map mapRecordList = {
'mapRecordListRet': {},
'listRecordList': [],
};
//用户功能权限索引map,便于直观理解和处理。map_UserAuth.length = 78;1968 - 2069,中间有许多ID没有
Map map_UserAuth = {
1968: '黑烟车初审',
1969: '黑烟车复审',
1970: '推送交警',
1971: '设备管理',
1972: '信息审核',
1973: '查看',
1975: '审核',
1976: '信息审核',
1977: '查看',
1979: '审核',
1980: '推送交警',
1981: '查看',
1983: '审核',
1984: 'LED显示设置',
1985: '查看',
1986: '新增',
1987: '编辑',
1988: '锁定',
1989: '删除',
1990: '导出',
1991: '导入',
1992: '设备管理',
1993: '查看',
1994: '新增',
1995: '编辑',
1996: '锁定',
1997: '删除',
1998: '导出',
1999: '导入',
2000: '点位管理',
2001: '查看',
2002: '新增',
2003: '编辑',
2004: '锁定',
2005: '删除',
2006: '导出',
2007: '导入',
2008: '历史数据',
2009: '查看',
2010: '新增',
2014: '审核',
2015: '打印',
2016: '导出',
2019: '报警信息管理',
2020: '查看',
2023: '锁定',
2025: '审核',
2027: '导出',
2028: '分析',
2029: '查询与统计',
2030: '历史数据查询',
2031: '查看',
2034: '导出',
2035: '分析',
2036: '车辆点位频率分析',
2037: '查看',
2041: '分析',
2042: '车辆轨迹查询',
2043: '查看',
2047: '分析',
2048: '年度数据统计',
2049: '查看',
2053: '分析',
2054: '实时统计',
2055: '实时统计今日抓拍数量',
2056: '历史数据',
2057: '查看',
2059: '审核',
2060: '导出',
2061: '监测点位状态',
2062: '查看',
2063: '分析',
2064: '监测点位状态详情',
2065: '查看',
2066: '分析',
2067: '车流量统计',
2068: '查看',
2069: '分析',
};
Future getUserAuthMap({@required String value, String key = 'id'}) {
int len = mapUserAuthList['listRecordList'].length;
map_UserAuth.clear();
for (int i = 0; i < len; i++) {
map_UserAuth[mapUserAuthList['listRecordList'][i][key]] =
mapUserAuthList['listRecordList'][i][value];
}
map_UserAuth = mapSort(map_UserAuth);
print('map_UserAuth.length = ${map_UserAuth.length}');
//print('map_UserAuth = $map_UserAuth'); //输出不全
my_segmentPrint(json_print(map_UserAuth, 1));
}
Future getUserAuth() {
int len = mapUserAuthList['listRecordList'].length;
map_UserAuth.clear();
for (int i = 0; i < len; i++) {
map_UserAuth[mapUserAuthList['listRecordList'][i]["id"]] =
mapUserAuthList['listRecordList'][i]["title"];
}
//按抓拍次数排序,升序
// listHycsGetList2.sort((a, b) =>
// (a[mapWzxxDataText[_selectedValue]].split(',').length.toString())
// .compareTo(b[mapWzxxDataText[_selectedValue]].split(',').length.toString()));
//print('map_UserAuth = $map_UserAuth'); //输出不全
print('map_UserAuth.length = ${map_UserAuth.length}');
my_segmentPrint('map_UserAuth = ${map_UserAuth}');
map_UserAuth = mapSort(map_UserAuth);
my_segmentPrint('map_UserAuth = ${map_UserAuth}');
//I/flutter ( 5140): map_UserAuth = {1968: 黑烟车初审, 1969: 黑烟车复审, 1970: 推送交警, 1971: 设备管理, 1972: 信息审核, 1973: 查看, 1975: 审核, 1976: 信息审核, 1977: 查看, 197
// 9: 审核, 1980: 推送交警, 1981: 查看, 1983: 审核, 1984: LED显示设置, 1985: 查看, 1986: 新增, 1987: 编辑, 1988: 锁定, 1989: 删除, 1990: 导出, 1991: 导入, 1992: 设备管理, 1993:
// 查看, 1994: 新增, 1995: 编辑, 1996: 锁定, 1997: 删除, 1998: 导出, 1999: 导入, 2000: 点位管理, 2001: 查看, 2002: 新增, 2003: 编辑, 2004: 锁定, 2005: 删除, 2006: 导出, 2007: 导
// 入, 2008: 历史数据, 2009: 查看, 2010: 新增, 2014: 审核, 2015: 打印, 2016: 导出, 2019: 报警信息管理, 2020: 查看, 2023: 锁定, 2025: 审核, 2027: 导出, 2028: 分析, 2029: 查询与统
// 计, 2030: 历史数据查询, 2031: 查看, 2034: 导出, 2035: 分析, 2036: 车
// I/flutter ( 5140): 辆点位频率分析, 2037: 查看, 2041: 分析, 2042: 车辆轨迹查询, 2043: 查看, 2047: 分析, 2048: 年度数据统计, 2049: 查看, 2053: 分析, 2054: 实时统计, 2055: 实时
// 统计今日抓拍数量, 2056: 历史数据, 2057: 查看, 2059: 审核, 2060: 导出, 2061: 监测点位状态, 2062: 查看, 2063: 分析, 2064: 监测点位状态详情, 2065: 查看, 2066: 分析, 2067: 车流量
// 统计, 2068: 查看, 2069: 分析}
}
mapSort(Map map) {
// List<String> keys = map.keys.toList();
// // key排序
// keys.sort((a, b) {
// List<int> al = a.codeUnits;
// List<int> bl = b.codeUnits;
// for (int i = 0; i < al.length; i++) {
// if (bl.length <= i) return 1;
// if (al[i] > bl[i]) {
// return 1;
// } else if (al[i] < bl[i]) return -1;
// }
// return 0;
// });
var sortedKeys = map_UserAuth.keys.toList()..sort();
//print('sortedKeys = $sortedKeys'); //输出不全
//segmentPrint('sortedKeys = ${sortedKeys}');
//I/flutter ( 5140): sortedKeys = [1968, 1969, 1970, 1971, 1972, 1973, 1975, 1976, 1977, 1979, 1980, 1981, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 199
// 4, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2014, 2015, 2016, 2019, 2020, 2023, 2025, 2027, 2028, 2029, 2030, 2031, 203
// 4, 2035, 2036, 2037, 2041, 2042, 2043, 2047, 2048, 2049, 2053, 2054, 2055, 2056, 2057, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069]
//new一个map按照keys的顺序将原先的map数据取出来就可以了。
Map sortedMap = {};
sortedKeys.forEach((element) {
sortedMap[element] = map[element];
});
return sortedMap;
}
+72
View File
@@ -0,0 +1,72 @@
import 'EncryptUtil.dart';
import 'dart:convert';
class UserInfo {
UserInfo({this.mapUserInfoRet}) {
setUserInfo(theMapUserInfoRet: mapUserInfoRet);
}
setUserInfo({Map theMapUserInfoRet}) {
if (200 == theMapUserInfoRet["ret"]) {
mapUserInfoRet = theMapUserInfoRet;
mapUserInfo = theMapUserInfoRet["data"];
print('mapUserInfo = ${mapUserInfo.toString()}');
}
}
//_mapGetData = {is_login: true, user_id: 135, token: 4C5B3F93FEACAEF4B6CAA7296F22CC67825D7E48B867614383D19E3F23DFE510}
setUserInfoFaceLogin(Map _mapGetData) {
mapUserInfo['user_id'] = _mapGetData['user_id'];
mapUserInfo['token'] = _mapGetData['token'];
}
Map mapUserInfoRet = {
"ret": 200,
"data": {
"is_login": true,
"user_id": 1,
"token": "B93EC91FA2FE293B7077162D4527FC4BB228CD6C0A4F24A882B9A8BBE6C3FB47"
},
"msg": ""
};
Map mapUserInfo = {
"is_login": false,
"user_id": -1,
"token": ""
};
//若list[i]为'',解密时会报错:aes decode error:RangeError: Value not in range: -16
String thisAndroidId = ''; //每个手机唯一的设备号
String username = '';
String password = '';
String userLoginInfo = '';
List<int> userGroupIDlist = []; //用户所属组列表
Map userRulesMap = {}; //用户所属组的权限列表
String getUserinfoEncrypted2() {
String userinfoEncrypted1 = EncryptUtil.aesEncode(thisAndroidId) +
'\n' +
EncryptUtil.aesEncode(username) +
'\n' +
EncryptUtil.aesEncode(password) +
'\n' +
EncryptUtil.aesEncode(userLoginInfo);
String userinfoEncrypted2 = EncryptUtil.aesEncode(userinfoEncrypted1);
return userinfoEncrypted2;
}
String getUserinfoDencrypted2(String userinfoEncrypted2) {
String userinfoDencrypted1 = EncryptUtil.aesDecode(userinfoEncrypted2);
List<String> list = userinfoDencrypted1.split('\n');
int len = list.length;
String userinfoDencrypted2 = '';
print('len = $len');
for (int i = 0; i < len; i++) {
list[i] = EncryptUtil.aesDecode(list[i]);
userinfoDencrypted2 += ('' == userinfoDencrypted2 ? '' : '\n') + list[i];
}
return userinfoDencrypted2;
}
}
+678
View File
@@ -0,0 +1,678 @@
import 'dart:convert';
import 'dart:developer' as developer;
import 'dart:io';
import 'dart:math';
import 'package:camera/camera.dart';
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart' as crypto;
import 'package:device_info/device_info.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
//import '../my_wechat_assets_picker_fix/my_asset_picker_1.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hyzp_ybqx/provider/player_region.dart';
import 'UserInfo.dart';
//LED字幕信息
//String g_ledMessage = '绿水青山就是金山银山 宜宾市生态环境局宣。';
// 是否已经调用 FlutterDownloader.initialize(debug: true)
bool bFlutterDownloader_initialize = false;
bool bNewVer = false; //是否发现新版本
//处理延时登录,判断从网络获取三种统计数据是否完成
bool bMayLogin = false;
//处理延时登录,判断是否已经点击登录按钮
bool bPreLoading = false;
//处理延时登录,判断用户名登录是否验证通过
bool bLoginVerify = false;
bool bHasMore = true;
//part library
//dart中,通过使用part、part of、library来实现拆分库,这样,就可以将一个庞大的库拆分成各种小库,只要引用主库即可
//点位总数
int dwSum = -1;
Size sizeWindowPhysicalSize;
//String dateAppCompile = '2020.12.30'; //1.0.1+1
//String dateAppCompile = '2021.02.20'; //1.2.5+1
//String dateAppCompile = '2021.03.18'; //1.2.6+1
//String dateAppCompile = '2021.05.18'; //1.2.7
List<String> g_list = [];
//正在获取点位视频标志,禁止重入
bool getingDwVideo = false;
int getCount = 1; //获取点位视频地址尝试次数
int getSumTime = 0; //获取点位视频地址耗时(秒)
int getingIndex = -1; //正在获取视频的点位的索引号
String getingDwmc = ''; //正在获取视频的点位名称
String urlnew =
"http://www.yibinu.edu.cn/__local/5/35/DF/264049B7E978EEE2F5849688986_05D4A6FE_152CDB8C.mp4?e=.mp4";
bool isVideoUrl(String url, {bool showToast = false}) {
print('url = $url');
String prefix = url.substring(0, 4);
List list = ['http', 'rtmp', 'rstp'];
for (String item in list) {
if (prefix == item) {
return true;
}
}
if (showToast) {
Fluttertoast.showToast(
msg: '获取视频地址失败',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
return false;
}
final TextEditingController myController = TextEditingController();
bool Playing = false; //禁止同时启动两次播放器
//final FijkPlayer player = FijkPlayer();
int g_iIndex = 0;
PlayerRegionProvide playerRegionProvide;
Future<void> sysPop() async {
// currentPos = player.currentPos.inMilliseconds; //seekto方法的参数是毫秒
// await writeCurrentPosFile();
// await player.stop();
await SystemChannels.platform.invokeMethod('SystemNavigator.pop');
}
//人脸注册和人脸识别登录成功标志
int faceReg = -1; //1 成功,0 失败,-1 处理中
int faceLogin = -1; //1 成功,0 失败,-1 处理中
//人脸注册时所需用户ID
int faceRegUserID = -1; //人脸注册时所需用户ID,-1 非法
List<CameraDescription> cameras;
UserInfo g_userInfo = UserInfo(mapUserInfoRet: {
"ret": 200,
"data": {
"is_login": true,
"user_id": 1,
"token": "B93EC91FA2FE293B7077162D4527FC4BB228CD6C0A4F24A882B9A8BBE6C3FB47"
},
"msg": ""
});
Future<Map> getMapFromJson(var response) async {
String _str = json.encode(response);
Map _map = json.decode(_str);
return _map;
}
// Future<void> getVideoList(BuildContext context) async {
// List<AssetEntity> assets = <AssetEntity>[];
// return await MyAssetPicker.pickAssets(
// context,
// maxAssets: 1,
// selectedAssets: assets,
// requestType: RequestType.video,
// );
// }
Future<String> getAndroidId() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
//print('每个手机唯一的设备号:${androidInfo.androidId}'); // e.g. "Moto G (4)"
g_userInfo.thisAndroidId = androidInfo.androidId;
return g_userInfo.thisAndroidId;
}
// void playOrPause() {
// playerRegionProvide.changePlayerState(bPlaying);
//
// if (bPlaying) {
// player.start();
// } else {
// player.pause();
// }
//
// Storage.setString('bFirstPlay', bFirstPlay ? 'true' : 'false');
// Storage.setString('bPlaying', bPlaying ? 'true' : 'false');
//
// //updateFile();
// }
//
// void playAndPause() {
// if (player.state == FijkState.started) {
// bPlaying = false;
// player.pause();
// } else if (player.state == FijkState.paused) {
// bPlaying = true;
// player.start();
// }
// //setState(() {});
// playerRegionProvide.changePlayerState(bPlaying);
// Storage.setString('bPlaying', bPlaying ? 'true' : 'false');
// }
Alignment getAlignment(Offset offset, Size size) {
// final double centerX = offset.dx / 2.0;
// final double centerY = offset.dy / 2.0;
//offset.dx = centerX + alignment.x * centerX;
//double alignmentX = (0.0 == centerX) ? 0.0 : ((offset.dx - centerX) / centerX);
double alignmentX = (offset.dx / size.width).clamp(-1.0, 1.0);
//offset.dy = centerY + alignment.y * centerY;
//double alignmentY = (0.0 == centerY) ? 0.0 : ((offset.dy - centerY) / centerY);
double alignmentY = (offset.dy / size.height).clamp(-1.0, 1.0);
// print('offset.dx = ${offset.dx}, offset.dy = ${offset.dy}');
print('Alignment.X = $alignmentX, Alignment.Y = $alignmentY');
return Alignment(alignmentX, alignmentY);
}
//flutter (dart)生成N位随机数
//https://blog.csdn.net/qq_36071410/article/details/101268640
// 庄童 2019-09-24 10:24:58 10271 收藏
String RandomBit(int len) {
String scopeF = '123456789'; //首位
String scopeC = '0123456789'; //中间
String result = '';
for (int i = 0; i < len; i++) {
if (i == 0) {
result = scopeF[Random().nextInt(scopeF.length)];
} else {
result = result + scopeC[Random().nextInt(scopeC.length)];
}
}
return result;
}
// sign=md5(ijddvzgEGaxbzsbmCtpdohxHyrAArwJB1003)
// =3967eaebec0eed0642a1d395ac9293dd
String APPkey = 'ijddvzgEGaxbzsbmCtpdohxHyrAArwJB';
//Flutter对字符串进行MD5运算 发表于 2019-03-26 更新于 2020-12-04 分类于 Flutter 阅读次
String GenerateMd5(String str) {
var content = new Utf8Encoder().convert(str);
var md5 = crypto.md5;
var digest = md5.convert(content);
return hex.encode(digest.bytes);
}
//加载中的圈圈
Widget getMoreWidget2({
Color color = Colors.white,
String text = '加载中...',
double size = 30.0,
double strokeWidth = 3.0,
FontWeight fontWeight,
double edge = 10.0,
double height = 34,
}) {
return Center(
child: Padding(
padding: EdgeInsets.all(edge),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
SizedBox(
height: size,
width: size,
child: CircularProgressIndicator(
strokeWidth: strokeWidth,
valueColor: AlwaysStoppedAnimation<Color>(color),
),
),
SizedBox(
height: ScreenUtil().setHeight(height),
),
Text(
text,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: size, // 文字大小
color: color,
fontWeight: fontWeight, // 文字颜色
),
),
],
),
),
);
}
//加载中的圈圈
Widget getMoreWidget({
String text = '加载中...',
Color color = Colors.white,
double size = 30.0,
double strokeWidth = 3.0,
TextAlign textAlign = TextAlign.left,
}) {
return Center(
child: Padding(
padding: EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
SizedBox(
height: size,
width: size,
child: CircularProgressIndicator(
strokeWidth: strokeWidth,
valueColor: AlwaysStoppedAnimation<Color>(color),
),
),
SizedBox(
height: 10,
),
Text(
text,
textAlign: textAlign,
style: TextStyle(
fontSize: size, // 文字大小
color: color,
),
),
],
),
),
);
}
//自定义带说明图标按钮函数。点击说明文字有反应
Widget getIconAndTextButton(
{IconData iconData, Color iconColor = Colors.black, var onPress = null}) {
return Container(
width: 50,
height: 50,
alignment: const Alignment(0, 0),
child: FlatButton(
padding: EdgeInsets.all(0),
onPressed: onPress,
//color: Colors.blue,
color: Colors.transparent,
//解决报错问题:FittedBox ← Expanded ← ConstrainedBox ← Container ← Center ← Padding ←
// Container ← IconTheme ← Builder ← _PointerListener
child: ConstrainedBox(
constraints: BoxConstraints(
maxHeight: 36, //最大高度
maxWidth: 36, //最大宽度
),
child: Padding(
padding: EdgeInsets.only(top: 1),
child: Icon(iconData, color: iconColor, size: 32),
// child: Image.asset(
// 'assets/images/left_arrow.png',
// fit: BoxFit.fitWidth,
// color: iconColor,
// //fit: BoxFit.cover,
// ),
),
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.end,
// children: [
// Image.asset('assets/images/left_arrow.png', fit: BoxFit.cover),
// // Expanded(
// // //child: Icon(iconData, color: iconColor, size: 24),
// // child: Image.asset('assets/images/left_arrow.png', fit: BoxFit.cover),
// // ),
// ],
// ),
),
//The offending Expanded is currently placed inside a ConstrainedBox widget.
//The ownership chain for the RenderObject that received the incompatible parent data was:
// FittedBox ← Expanded ← ConstrainedBox ← Container ← Center ← Padding ← Container ← IconTheme ←
//Builder ← _PointerListener
//The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a
//RenderObject, which has been set up to accept ParentData of incompatible type ParentData.
//Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically,
//Expanded widgets are placed directly inside Flex widgets.
//The offending Expanded is currently placed inside a FittedBox widget.
//The ownership chain for the RenderObject that received the incompatible parent data was:
// ConstrainedBox ← Container ← Expanded ← FittedBox ← Center ← Padding ← Container ← IconTheme ←
//Builder ← _PointerListener ← ⋯
// child: ConstrainedBox(
// constraints: BoxConstraints(
// maxHeight: 20, //最大高度
// maxWidth: 28, //最大宽度
// ),
// child: Container(
// child: Expanded(
// child: new Icon(iconData, color: iconColor),
// ),
// ),
// ),
// child: ConstrainedBox(
// constraints: BoxConstraints(
// maxHeight: 30, //最大高度
// maxWidth: 38, //最大宽度
// minWidth: 38, //最大宽度
// ),
// child: Row(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Expanded(
// child: Icon(iconData, color: iconColor, size: 24),
// ),
// ],
// ),
// ),
// child: Container(
// width: 28,
// height: 20,
// child: Expanded(
// child: new FittedBox(
// fit: BoxFit.fill,
// child: new Icon(iconData, color: iconColor),
// ),
// ),
// ),
// child: FittedBox(
// fit: BoxFit.fitWidth,
// alignment: Alignment.topLeft,
// child: Container(
// width: 28,
// height: 20,
// child: Expanded(
// child: new FittedBox(
// fit: BoxFit.fill,
// child: new Icon(iconData, color: iconColor),
// ),
// ),
// ),
// ),
),
);
}
///获取缩进空白符
String getDeepSpace(int deep) {
var tab = StringBuffer();
for (int i = 0; i < deep; i++) {
tab.write("\t");
}
return tab.toString();
}
// List map2list(Map _map) {
// List _list = [];
// _list = List.generate(listContacts2[widget.contactIndex].length, (index) {
// String key = listContacts2[widget.contactIndex].keys.elementAt(index);
// //return TextEditingController(text: listContacts2[widget.contactIndex][key]);
// return TextEditingController(text: getUserText3(widget.contactIndex, key));
// });
//
// }
/// [object] 解析的对象
/// [deep] 递归的深度,用来获取缩进的空白长度
/// [isObject] 用来区分当前map或list是不是来自某个字段,则不用显示缩进。单纯的map或list需要添加缩进
String json_print(dynamic object, int deep, {bool isObject = false}) {
var buffer = StringBuffer();
var nextDeep = deep + 1;
if (object is Map) {
var list = object.keys.toList();
if (!isObject) {
//如果map来自某个字段,则不需要显示缩进
buffer.write("${getDeepSpace(deep)}");
}
buffer.write("{");
if (list.isEmpty) {
//当map为空,直接返回‘}’
buffer.write("}");
} else {
buffer.write("\n");
for (int i = 0; i < list.length; i++) {
buffer.write("${getDeepSpace(nextDeep)}\"${list[i]}\":");
buffer.write(json_print(object[list[i]], nextDeep, isObject: true));
if (i < list.length - 1) {
buffer.write(",");
buffer.write("\n");
}
}
buffer.write("\n");
buffer.write("${getDeepSpace(deep)}}");
}
} else if (object is List) {
if (!isObject) {
//如果list来自某个字段,则不需要显示缩进
buffer.write("${getDeepSpace(deep)}");
}
buffer.write("[");
if (object.isEmpty) {
//当list为空,直接返回‘]’
buffer.write("]");
} else {
buffer.write("\n");
for (int i = 0; i < object.length; i++) {
buffer.write(json_print(object[i], nextDeep));
if (i < object.length - 1) {
buffer.write(",");
buffer.write("\n");
}
}
buffer.write("\n");
buffer.write("${getDeepSpace(deep)}]");
}
} else if (object is String) {
//为字符串时,需要添加双引号并返回当前内容
buffer.write("\"$object\"");
} else if (object is num || object is bool) {
//为数字或者布尔值时,返回当前内容
buffer.write(object);
} else {
//如果对象为空,则返回null字符串
buffer.write("null");
}
return buffer.toString();
}
//人脸识别和上传的图片,都需要转换为 Base64 格式的字符串提交
//通过图片路径将图片转换成 Base64 字符串
Future image2Base64(String imagePath) async {
File file = File(imagePath);
List<int> imageBytes = await file.readAsBytes();
String bs64 = base64Encode(imageBytes);
String ext = getFileExtension(imagePath);
print('imagePath = $imagePath, ext = $ext');
//String bs64Image = "data:image/png;base64," + bs64;
String bs64Image = "data:image/${ext};base64," + bs64;
return bs64Image;
}
//从字符路径 path 获取扩展名,不含点号
getFileExtension(String path) {
//return path.substring(path.lastIndexOf('.'));
//imagePath = /data/user/0/com.flutter.hyzp_ybqx/app_flutter/Pictures/flutter_test/1614662209478.jpg, ext = .jpg
return path.substring(path.lastIndexOf('.') + 1); //不含点号
}
//从字符路径 path 获取文件名(含扩展名)
getFileName(String path) {
//return path.substring(path.lastIndexOf('.'));
//imagePath = /data/user/0/com.flutter.hyzp_ybqx/app_flutter/Pictures/flutter_test/1614662209478.jpg, ext = .jpg
return path.substring(path.lastIndexOf('/') + 1); //不含点号
}
Widget getBtnSizeX({@required text, double width = 70.0, double height = 40.0, onPressedFun}) {
return Container(
color: Colors.white12, //onPressedFun为null时无效
width: width,
height: height,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text(text),
onPressed: onPressedFun,
),
);
}
//返回主页ashamp
// 博客园首页新随笔联系管理订阅订阅随笔 - 33 文章 - 0 评论 - 51 阅读 - 55018
// 在debug时使Flutter中的print打印json数据时更美观易读
// 为了避免deubg信息在生产环境打印,只在测试时打印,在main函数中,改变debugPrint的指向
//
// 复制代码
// main(){
// if (Api.isDebug) {
// debugPrint = (String message, {int wrapWidth}) {
// try {
// var object = json.decode(message);
// message = JsonEncoder.withIndent(' ').convert(object);
// } catch (e) {}
// printWrapped(message);
// };
// } else {
// debugPrint = (String message, {int wrapWidth}) {};
// }
// }
// 复制代码
// 将printWrapped方法放入工具类或你需要的地方
//
// void printWrapped(String text) {
// final pattern = new RegExp('.{1,800}'); // 800 is the size of each chunk
// pattern.allMatches(text).forEach((match) => developer.log(match.group(0)));
// }
// log方法需要引入
//
// import 'dart:developer' as developer;
//
//在debug时使 Flutter 中的 print 打印 json 数据时更美观易读
void jsonPrint(String message, {int len = 800}) {
//是否在生产环境
const bool isDebug = !const bool.fromEnvironment("dart.vm.product");
// if (!isDebug) {
// return;
// }
try {
var object = json.decode(message);
message = JsonEncoder.withIndent(' ').convert(object);
} catch (e) {
print('e = $e');
}
printWrapped(message);
}
// 打印长字符串
void printWrapped(String text, {int len = 800}) {
final pattern = RegExp('.{1,$len}'); // 800 is the size of each chunk
pattern.allMatches(text).forEach((match) => developer.log(match.group(0)));
}
//OK
void my_segmentPrint(String str, {int len = 800}) {
//是否在生产环境
const bool isDebug = !const bool.fromEnvironment("dart.vm.product");
if (!isDebug) {
return;
}
List list = strToList(str);
for (int i = 0; i < list.length; i++) {
print('${list[i]}');
}
}
//OK
List strToList(String str, {int len = 800}) {
List<String> strList = [];
if (str.length <= len) {
strList.add(str);
} else {
int splitCount = str.length ~/ len; //应该切割的次数
for (int i = 0; i < splitCount; i++) {
strList.add(str.substring(len * i, len * (i + 1)));
}
//处理最后一段
if (str.length % len != 0) {
strList.add(str.substring(len * splitCount));
}
}
print('strList:${strList.toString}');
return strList;
}
Widget getImageWidget() {
return Container(
alignment: Alignment(0, 0),
height: ScreenUtil().setHeight(346),
width: ScreenUtil().setWidth(942),
decoration: BoxDecoration(
image: DecorationImage(image: AssetImage('assets/images/装饰图片10.png'), fit: BoxFit.cover),
),
child: Column(
children: [
Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(top: ScreenUtil().setWidth(30), left: ScreenUtil().setWidth(55)),
child: Text('改善城市空气质量', style: TextStyle(fontSize: 17, color: Colors.white)),
),
Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.only(left: ScreenUtil().setWidth(55)),
child: Text('建设长江生态第一城',
style: TextStyle(
fontSize: 19,
color: Color.fromRGBO(49, 216, 123, 1),
fontWeight: FontWeight.bold)),
),
],
),
// child: Image.asset(
// 'assets/images/装饰图片10.png',
// fit: BoxFit.cover,
// ),
);
}
Widget getIconBtnSizeX(
{@required text,
width = 233,
height = 116,
onTop,
Color color = Colors.black,
double circular = 10,
double textSize = 18}) {
return InkWell(
onTap: onTop,
child: Container(
alignment: Alignment(0, 0),
margin: EdgeInsets.all(0),
padding: EdgeInsets.all(0),
width: ScreenUtil().setWidth(width),
height: ScreenUtil().setHeight(height),
decoration: BoxDecoration(color: color, borderRadius: BorderRadius.circular(circular)),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(width: ScreenUtil().setWidth(12)),
Icon(Icons.play_arrow, color: Colors.white, size: ScreenUtil().setWidth(56)),
Text(
text,
style: TextStyle(color: Colors.white, fontSize: textSize),
)
],
),
),
);
}
+166
View File
@@ -0,0 +1,166 @@
import 'package:flutter/material.dart';
import 'customDialogC.dart';
import 'commonFun.dart';
//视频列表對話框
class customDialogA extends Dialog {
String title;
String content;
String url;
customDialogA({this.title = "", this.content = "", this.url = ''});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
// TODO: implement build
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
alignment: Alignment(0, 0),
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.85,
width: mediaSize.width * 0.95,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
//border: Border.all(color: Colors.blue, width: 1.0),
borderRadius: BorderRadius.all(
Radius.circular(2),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text("${this.title}",
style: TextStyle(
fontSize: 18.0,
)),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, url);
},
),
)
],
),
),
Divider(),
//addDialoadContainer4(context, g_list, url),
//MyDialogContent(countries: ['china', 'England']),
MyDialogContent(list: g_list, url: url),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
RaisedButton(
onPressed: () {
Navigator.pop(context, url);
},
child: Text("取消"),
),
RaisedButton(
child: Text("确认"),
onPressed: () async {
Navigator.pop(context, url); //关闭弹框,播放输入视频地址
},
)
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
Navigator.pop(context, url);
},
);
}
}
class MyDialogContent extends StatefulWidget {
List<String> list;
String url;
MyDialogContent({this.list, this.url});
@override
_MyDialogContentState createState() => new _MyDialogContentState();
}
class _MyDialogContentState extends State<MyDialogContent> {
@override
Widget build(BuildContext context) {
return addDialoadContainer4(context, widget.list, widget.url);
}
Widget addDialoadContainer4(
BuildContext context, List<String> list, String url) {
Size mediaSize = MediaQuery.of(context).size;
int i = 0;
print('\ng_list start =========================================\n');
for (var s in list) {
print('$i - ' + s + '\n');
i++;
}
print('g_list start =========================================\n\n');
return Container(
height: mediaSize.height * 0.65, //0.75越界,0.7不越界。需要0.2 = 0.9 - 0.7
width: mediaSize.width * 0.9,
child: ListView.builder(
shrinkWrap: true,
itemCount: list.length,
itemBuilder: (BuildContext context, int index) {
int index2 = index + 1;
return Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
padding: EdgeInsets.fromLTRB(20, 0, 10, 0),
child: InkWell(
child: Text('$index2 : ' + list[index],
style: TextStyle(fontSize: 15.0)),
onTap: () {
print('index : $index');
Navigator.pop(context, list[index]);
},
onLongPress: () async {
await showDialog(
context: context,
builder: (context) {
myController.text = '';
return CustomDialogC(
title: "选择操作",
url: g_list[index],
index: index,
);
});
setState(() {});
},
),
),
Divider(),
],
);
},
),
);
}
}
+188
View File
@@ -0,0 +1,188 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
import 'package:flutter/services.dart';
//输入视频地址对话框
class customDialogB extends Dialog {
String title;
String content;
String url;
customDialogB({this.title = "", this.content = "", this.url = ''});
// Widget getButton({double width = 60.0, double height = 30.0, RaisedButton raisedButton}) {
// return ButtonTheme(
// minWidth: width, //设置最小宽度
// height: height,
// //colorScheme: ,
// buttonColor: Colors.white60,
// child: raisedButton,
// );
// }
Widget getBtnSizeX({@required text, width = 60.0, height = 30.0, onPressedFun}) {
return Container(
color: Colors.white12, //onPressedFun为null时无效
width: width,
height: height,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text(text),
onPressed: onPressedFun,
),
);
}
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
// TODO: implement build
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
alignment: Alignment(0, -0.7),
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.4,
width: mediaSize.width * 0.95,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
//border: Border.all(color: Colors.blue, width: 1.0),
borderRadius: BorderRadius.all(
Radius.circular(2),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${this.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, url);
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
child: TextField(
maxLines: 4,
controller: myController,
autofocus: false, //不会自动打开输入键盘
decoration: InputDecoration(
fillColor: Theme.of(context).hoverColor,
filled: true,
hintText: 'Media Url',
border: OutlineInputBorder()
//labelText: 'Media Url',
),
),
),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getBtnSizeX(
text: "粘贴",
onPressedFun: () async {
ClipboardData data = await Clipboard.getData(Clipboard.kTextPlain);
myController.text = data.text;
},
),
// getButton(
// raisedButton: RaisedButton(
// onPressed: () async {
// ClipboardData data =
// await Clipboard.getData(Clipboard.kTextPlain);
// myController.text = data.text;
// },
// child: Text("粘贴"),
// ),
// ),
getBtnSizeX(
text: "获取",
onPressedFun: () async {
myController.text = url;
},
),
// getButton(
// raisedButton: RaisedButton(
// onPressed: () async {
// myController.text = url;
// },
// child: Text("获取"),
// ),
// ),
getBtnSizeX(
text: "清除",
onPressedFun: () {
myController.clear();
},
),
// getButton(
// raisedButton: RaisedButton(
// onPressed: () {
// myController.clear();
// },
// child: Text("清除"),
// ),
// ),
getBtnSizeX(
text: "播放",
onPressedFun: () {
//Navigator.of(context).pop() //关闭弹框,这样关闭会导致视频播放停止,无法开始
if ("" != myController.text) {
urlnew = url = myController.text;
}
Navigator.pop(context, url); //关闭弹框,播放输入视频地址
},
),
// getButton(
// raisedButton: RaisedButton(
// onPressed: () {
// //Navigator.of(context).pop() //关闭弹框,这样关闭会导致视频播放停止,无法开始
// if ("" != myController.text) {
// urlnew = url = myController.text;
// }
// Navigator.pop(context, url); //关闭弹框,播放输入视频地址
// },
// child: Text("播放"),
// ),
// ),
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
Navigator.pop(context, url);
},
);
}
}
+124
View File
@@ -0,0 +1,124 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
//删除确认对话框
class CustomDialogC extends Dialog {
String title;
String url;
int index;
CustomDialogC({this.title = "", this.url = "", this.index});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
alignment: Alignment(0, -0.7),
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.35,
width: mediaSize.width * 0.85,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
//border: Border.all(color: Colors.blue, width: 1.0),
borderRadius: BorderRadius.all(
Radius.circular(2),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${this.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, url);
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
height: mediaSize.height * 0.15,
child: SingleChildScrollView(
child: Text(index.toString() + ' : ' + url),
),
),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
// RaisedButton(
// onPressed: () async {
// await showDialog(
// context: context,
// builder: (context) {
// myController.text = g_list[index].trim();
// return CustomDialogD(
// title: "修改视频地址",
// content: g_list[index].trim(),
// url: urlnew);
// });
// String url0 = g_list[index].trim().toLowerCase();
// String url2 = myController.text.trim().toLowerCase();
// if (url2.isNotEmpty && 0 != url0.compareTo(url2)) {
// g_list.removeAt(index);
// g_list.add(url2);
// await updateFile();
// }
// Navigator.pop(context, url); //关闭弹框,返回sRet
// },
// child: Text("修改"),
// ),
RaisedButton(
onPressed: () async {
g_list.removeAt(index);
//await updateFile();
//writeUrlFile2();
Navigator.pop(context, url); //关闭弹框,返回sRet
},
child: Text("删除"),
),
RaisedButton(
child: Text("取消"),
onPressed: () async {
Navigator.pop(context, url); //关闭弹框,返回sRet
},
)
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
Navigator.pop(context, url);
},
);
}
}
+115
View File
@@ -0,0 +1,115 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
//修改视频地址对话框
class CustomDialogD extends Dialog {
String title;
String content;
String url;
CustomDialogD({this.title = "", this.content = "", this.url = ''});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
myController.text = content; //为TextField赋初始值
// TODO: implement build
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
alignment: Alignment(0, -0.7),
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.4,
width: mediaSize.width * 0.85,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
//border: Border.all(color: Colors.blue, width: 1.0),
borderRadius: BorderRadius.all(
Radius.circular(2),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${this.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, url);
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
child: TextField(
maxLines: 4,
controller: myController,
autofocus: false, //不会自动打开输入键盘
decoration: InputDecoration(
fillColor: Theme.of(context).hoverColor,
filled: true,
hintText: 'Media Url',
border: OutlineInputBorder()
//labelText: 'Media Url',
),
),
),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
RaisedButton(
onPressed: () {
myController.text = url;
},
child: Text("获取"),
),
RaisedButton(
onPressed: () {
myController.clear();
},
child: Text("清除"),
),
RaisedButton(
child: Text("确认"),
onPressed: () async {
Navigator.pop(context, url); //关闭弹框,播放输入视频地址
},
)
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
Navigator.pop(context, url);
},
);
}
}
+177
View File
@@ -0,0 +1,177 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'doJSON.dart';
import 'hyxx_data_handle.dart';
import 'dart:convert';
import '../pages/MyMsics/03_personal/ContactModify.dart';
import '../pages/MyMsics/03_personal/ContactAdd.dart';
//添加、修改、删除联系人对话框
class customDialogE extends Dialog {
String title;
String content;
int index;
customDialogE({this.title = "", this.content = "", this.index = -1});
// String getTitle(int index) {
// return listContacts2[index]["姓名"] +
// ', ' +
// listContacts2[index]["部门"] +
// ', ' +
// listContacts2[index]["职务"] +
// '\n' +
// listContacts2[index]["手机"] +
// ', ' +
// listContacts2[index]["邮箱"];
// }
Widget getBtnSizeX({@required text, width = 60.0, height = 30.0, onPressedFun}) {
return Container(
color: Colors.white12, //onPressedFun为null时无效
width: width,
height: height,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text(text),
onPressed: onPressedFun,
),
);
}
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
//myController.text = getTitle(this.index);
myController.text = content;
// TODO: implement build
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
alignment: Alignment(0, -0.7),
child: Container(
height: mediaSize.height * 0.4,
width: mediaSize.width * 0.95,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
Radius.circular(2),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${this.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
//Navigator.pop(context, index);
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
child: TextField(
maxLines: 4,
controller: myController,
autofocus: false,
//不会自动打开输入键盘
decoration: InputDecoration(
fillColor: Theme.of(context).hoverColor,
filled: true,
hintText: 'Media Url',
border: OutlineInputBorder(),
),
enableInteractiveSelection: false,
onTap: () {
FocusScope.of(context).requestFocus(new FocusNode());
},
),
),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getBtnSizeX(
text: "添加",
onPressedFun: () async {
//跳转到修改对话框
Navigator.of(context)
.push(MaterialPageRoute(
builder: (context) => ContactAdd(contactIndex: index)))
.then((value) => Navigator.pop(context));
},
),
getBtnSizeX(
text: "修改",
onPressedFun: () async {
//跳转到修改对话框
await Navigator.of(context).push(MaterialPageRoute(
builder: (context) => ContactModify(contactIndex: index)));
await Navigator.pop(context); //先关闭“选择操作”对话框
//跳转并关闭当前页面
// Navigator.pushAndRemoveUntil(
// context,
// MaterialPageRoute(
// builder: (context) => ContactModify(contactIndex: index)),
// (route) => route == null,
// );
},
),
getBtnSizeX(
text: "删除",
onPressedFun: () {
listContacts2.removeAt(index);
bFlash = true;
print("ContactDel bFlash = $bFlash");
writeJSON(json.encode(listContacts2), 'listContacts2.json');
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
getBtnSizeX(
text: "复制",
onPressedFun: () {
// Flutter 复制文本到剪贴板
Clipboard.setData(ClipboardData(text: myController.text));
//showToast('帮助信息已复制到剪贴板', textAlign: TextAlign.left);
Fluttertoast.showToast(msg: '联系人信息已复制到剪贴板', gravity: ToastGravity.BOTTOM);
},
),
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
//Navigator.pop(context, index);
},
);
}
}
+102
View File
@@ -0,0 +1,102 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
//确认对话框
class CustomDialogF extends Dialog {
String title;
String content;
bool ret = false;
CustomDialogF({this.title = "", this.content});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
padding: EdgeInsets.only(top: 126),
alignment: Alignment(0, -1),
color: Colors.black12,
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.315,
width: mediaSize.width * 0.9,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.blue, width: 2.0),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${this.title}",
style: TextStyle(
fontSize: 20.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, ret);
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
height: mediaSize.height * 0.1,
child: SingleChildScrollView(
child: Text(content, style: TextStyle(fontSize: 18.0, color: Colors.blue)),
),
),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
RaisedButton(
onPressed: () async {
ret = true;
Navigator.pop(context, ret); //关闭弹框,返回sRet
},
child: Text("确认"),
),
RaisedButton(
child: Text("取消"),
onPressed: () async {
Navigator.pop(context, ret); //关闭弹框,返回sRet
},
)
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
Navigator.pop(context, ret);
},
);
}
}
+143
View File
@@ -0,0 +1,143 @@
import 'package:flutter/material.dart';
import 'package:flutter_drag_scale/core/drag_scale_widget.dart';
import 'dart:io';
//确认对话框
class CustomDialogFaceReg extends Dialog {
String title;
String username;
String imagePath;
Size imageSize;
CustomDialogFaceReg(
{@required this.username,
@required this.imagePath,
@required this.imageSize,
this.title = ""});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
padding: EdgeInsets.only(top: 45),
alignment: Alignment(0, -1),
color: Colors.black12,
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.9,
width: mediaSize.width * 0.98,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.blue, width: 2.0),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
title,
style: TextStyle(
fontSize: 20.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, false);
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 5, 20, 10),
width: double.infinity,
height: mediaSize.height * 0.1,
child: SingleChildScrollView(
child: RichText(
text: TextSpan(children: [
TextSpan(
text: '是否确定为用户 ', style: TextStyle(fontSize: 18.0, color: Colors.blue)),
TextSpan(
text: username,
style: TextStyle(
fontSize: 18.0, fontWeight: FontWeight.bold, color: Colors.red)),
TextSpan(
text: ' 注册或更新以下人脸图片?',
style: TextStyle(fontSize: 18.0, color: Colors.blue)),
]),
),
),
),
//SizedBox(height: 10),
//480*720
Text('宽高:${imageSize.width}x${imageSize.height}', style: TextStyle(fontSize: 18)),
SizedBox(height: 5),
SingleChildScrollView(
//滑动的方向 Axis.vertical为垂直方向滑动,Axis.horizontal 为水平方向
scrollDirection: Axis.vertical,
reverse: false,
padding: EdgeInsets.all(0.0),
//滑动到底部回弹效果
physics: BouncingScrollPhysics(),
child: Container(
alignment: Alignment(0, 0),
height: mediaSize.height * 0.52,
width: mediaSize.width * 0.95,
decoration: BoxDecoration(
border: Border.all(color: Colors.orange, width: 1.0),
borderRadius: BorderRadius.circular(5),
),
//DragScaleContainer 插件只能放大,不能缩小到比原始尺寸小
child: DragScaleContainer(
doubleTapStillScale: true,
child: Image.file(File(imagePath), fit: BoxFit.fitHeight)),
),
),
SizedBox(height: 10),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
RaisedButton(
onPressed: () async {
Navigator.pop(context, true); //关闭弹框,返回 true
},
child: Text("确认"),
),
RaisedButton(
child: Text("取消"),
onPressed: () async {
Navigator.pop(context, false); //关闭弹框,返回 false
},
)
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
Navigator.pop(context, false);
},
);
}
}
+323
View File
@@ -0,0 +1,323 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
import '../res/listContacts.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'doJSON.dart';
import 'hyxx_data_handle.dart';
import 'dart:convert';
import '../pages/MyMsics/03_personal/ContactModify.dart';
import '../pages/MyMsics/03_personal/ContactAdd.dart';
//删除消息对话框。自定义透明背景窗口,类似对话框
class customDialogG extends StatefulWidget {
customDialogG({Key key, this.title = "", this.index = -1}) : super(key: key);
String title;
int index;
_CheckBoxDemoState createState() => _CheckBoxDemoState();
}
class _CheckBoxDemoState extends State<customDialogG> {
String getTitle(int index) {
// return listContacts2[index]["姓名"] +
// ', ' +
// listContacts2[index]["部门"] +
// ', ' +
// listContacts2[index]["职务"] +
// '\n' +
// listContacts2[index]["手机"] +
// ', ' +
// listContacts2[index]["邮箱"];
}
@override
void initState() {
// TODO: implement initState
super.initState();
bFlash = false;
getContent();
}
String strContent = '';
getContent() async {
if (0 == widget.title.compareTo('收到的消息')) {
strContent = "第 ${widget.index + 1} 条(共 ${listMessagesInbox2.length} 条)" +
"\n" +
"时间:" +
listMessagesInbox2[widget.index]['date'] +
", " +
listMessagesInbox2[widget.index]['time'] +
"\n\n" +
"内容:" +
listMessagesInbox2[widget.index]['content'];
} else if (0 == widget.title.compareTo('发送的消息')) {
strContent = "第 ${widget.index + 1} 条(共 ${listMessagesOutbox2.length} 条)" +
"\n" +
"时间:" +
listMessagesOutbox2[widget.index]['date'] +
", " +
listMessagesOutbox2[widget.index]['time'] +
"\n\n" +
"内容:" +
listMessagesOutbox2[widget.index]['content'];
}
setState(() {});
}
bool flagSelect = false;
bool flagInbox = false;
bool flagOutbox = false;
Widget getCheckBoxs() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(children: <Widget>[
SizedBox(width: 10),
Checkbox(
value: flagInbox || flagOutbox ? false : flagSelect,
onChanged: flagInbox || flagOutbox
? null
: (v) {
setState(() {
flagSelect = v;
});
},
),
Text('删除当前选择的消息'),
]),
Row(children: <Widget>[
SizedBox(width: 10),
Checkbox(
value: flagInbox,
onChanged: (v) {
setState(() {
flagInbox = v;
});
},
),
Text('删除所有收到的消息'),
]),
Row(children: <Widget>[
SizedBox(width: 10),
Checkbox(
value: flagOutbox,
onChanged: (v) {
setState(() {
flagOutbox = v;
});
},
),
Text('删除所有发送的消息'),
]),
],
);
}
Widget getBtnSizeX({@required text, width = 60.0, height = 30.0, onPressedFun}) {
return Container(
color: Colors.white12, //onPressedFun为null时无效
width: width,
height: height,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text(text),
onPressed: onPressedFun,
),
);
}
Future<bool> alertDialog(String title, String content, var onPresse) async {
return await showDialog(
barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框
context: context,
builder: (context) {
return AlertDialog(
title: Text(title),
content: Text(content),
actions: <Widget>[
FlatButton(
child: Text("确定"),
onPressed: onPresse,
),
FlatButton(
child: Text("取消"),
onPressed: () {
Navigator.pop(context, false);
},
),
],
);
},
);
}
@override
Widget build(BuildContext context) {
SystemUiOverlayStyle(statusBarColor: Colors.transparent);
Size mediaSize = MediaQuery.of(context).size;
myController.text = getTitle(widget.index);
// TODO: implement build
return WillPopScope(
child: Scaffold(
//type: MaterialType.transparency,
//color: Colors.transparent,
//backgroundColor: Colors.transparent,
//color: Colors.blue,
backgroundColor: Color.fromRGBO(212, 212, 212, 0.6),
body: SafeArea(
child: Stack(
children: <Widget>[
Container(
alignment: Alignment(0, -0.4),
child: Container(
height: mediaSize.height * 0.7,
width: mediaSize.width * 0.95,
decoration: BoxDecoration(
color: Colors.white,
//border: Border.all(width: 1.0, color: Colors.black),
borderRadius: BorderRadius.all(
Radius.circular(3),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${widget.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
//Navigator.pop(context, index);
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
)
],
),
),
Divider(),
// Container(
// padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
// width: double.infinity,
// child: SingleChildScrollView(
// child: Container(
// child: Text(strContent),
// ),
// ),
// ),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
child: Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.0, color: Colors.blue),
borderRadius: BorderRadius.all(
Radius.circular(3),
),
),
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
height: mediaSize.height * 0.2,
child: SingleChildScrollView(
child: Container(
child: Text(strContent),
),
),
),
),
SizedBox(height: 10),
getCheckBoxs(),
SizedBox(height: 10),
Expanded(
child: Container(),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getBtnSizeX(
text: "删除",
onPressedFun: () async {
// listContacts2.removeAt(widget.index);
// bFlash = true;
// print("ContactDel bFlash = $bFlash");
// writeJSON(json.encode(listContacts2), 'listContacts2.json');
bool ret = await alertDialog('删除确认', '是否确定要删除选中的项目?', () {
print("flagInbox = $flagInbox");
print("flagOutbox = $flagOutbox");
print("flagSelect = $flagSelect");
if (flagInbox || flagOutbox) {
bFlash = true;
if (flagInbox) {
listMessagesInbox2.clear();
writeJSON(json.encode(listMessagesInbox2),
'listMessagesInbox02.json');
}
if (flagOutbox) {
listMessagesOutbox2.clear();
writeJSON(json.encode(listMessagesOutbox2),
'listMessagesOutbox02.json');
}
} else if (flagSelect) {
bFlash = true;
if (0 == widget.title.compareTo('收到的消息')) {
listMessagesInbox2.removeAt(widget.index);
writeJSON(json.encode(listMessagesInbox2),
'listMessagesInbox02.json');
} else if (0 == widget.title.compareTo('发送的消息')) {
listMessagesOutbox2.removeAt(widget.index);
writeJSON(json.encode(listMessagesOutbox2),
'listMessagesOutbox02.json');
}
}
print("bFlash = $bFlash");
Navigator.pop(context, true);
});
if (ret) {
Navigator.pop(context); //关闭弹框,播放输入视频地址
}
},
),
getBtnSizeX(
text: "取消",
onPressedFun: () {
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
],
),
SizedBox(height: 50),
],
),
),
),
],
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
Navigator.pop(context);
},
);
}
}
+160
View File
@@ -0,0 +1,160 @@
import 'package:flutter/material.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';
import 'package:dio/dio.dart';
import '../config/service_url.dart';
//拍照、选择相册图片对话框
class customDialogH extends Dialog {
String title;
String content;
int index;
customDialogH({this.title = "", this.content = "", this.index = -1});
Widget getBtnSizeX({@required text, width = 60.0, height = 30.0, onPressedFun}) {
return Container(
color: Colors.white12, //onPressedFun为null时无效
width: width,
height: height,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text(text),
onPressed: onPressedFun,
),
);
}
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
// TODO: implement build
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
alignment: Alignment(0, -0.7),
child: Container(
height: mediaSize.height * 0.25,
width: mediaSize.width * 0.95,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(
Radius.circular(2),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${this.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
)
],
),
),
Divider(),
SizedBox(height: 35),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getBtnSizeX(
text: "拍照",
onPressedFun: () async {
await _takePhoto();
await Navigator.pop(context, _imagePath); //先关闭“选择操作”对话框
},
),
getBtnSizeX(
text: "从相册选择",
width: 110.0,
onPressedFun: () async {
await _openGallery();
await Navigator.pop(context, _imagePath); //先关闭“选择操作”对话框
},
),
getBtnSizeX(
text: "取消",
onPressedFun: () {
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
// player.pause();
Navigator.pop(context);
},
);
}
File _image;
String _imagePath = '';
final picker = ImagePicker();
/*拍照*/
_takePhoto() async {
final pickedFile = await picker.getImage(source: ImageSource.camera);
if (pickedFile != null) {
_image = File(pickedFile.path);
_imagePath = pickedFile.path;
this._uploadImage(_image);
} else {
print('No image selected.');
}
}
/*相册*/
_openGallery() async {
final pickedFile = await picker.getImage(source: ImageSource.gallery);
if (pickedFile != null) {
_image = File(pickedFile.path);
_imagePath = pickedFile.path;
this._uploadImage(_image);
} else {
print('No image selected.');
}
}
//上传图片
_uploadImage(File _imageDir) async {
//注意:dio3.x版本为了兼容web做了一些修改,上传图片的时候需要把File类型转换成String类型,具体代码如下
var fileDir = _imageDir.path;
FormData formData = FormData.fromMap({
"name": "zhangsna 6666666666",
"age": 20,
"sex": "男",
"file": await MultipartFile.fromFile(fileDir, filename: "xxx.jpg")
});
//var response = await Dio().post(ServicePath.uploadImageUrl, data: fileDir);
var response = await Dio().post(ServiceUrlJd, data: fileDir);
print(response);
}
}
+119
View File
@@ -0,0 +1,119 @@
import 'package:flutter/material.dart';
import 'package:hyzp_ybqx/components/dioFun.dart';
import 'commonFun.dart';
//确认对话框
class CustomDialogHysh extends Dialog {
String title;
String content;
String shjg; //审核结果
bool ret = false;
CustomDialogHysh({@required this.shjg, this.title = "", this.content});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
padding: EdgeInsets.only(top: 122),
alignment: Alignment(0, -1),
color: Colors.black12,
child: Container(
// height: 260,
// width: 300,
height: mediaSize.height * 0.35,
width: mediaSize.width * 0.98,
//color: Colors.white, //Cannot provide both a color and a decoration
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.blue, width: 2.0),
borderRadius: BorderRadius.all(
Radius.circular(5),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: Text(
"${title}确认",
style: TextStyle(
fontSize: 20.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context, ret);
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 5, 20, 10),
width: double.infinity,
height: mediaSize.height * 0.15,
child: SingleChildScrollView(
child: RichText(
text: TextSpan(children: [
TextSpan(
text: '${title}为 ',
style: TextStyle(fontSize: 18.0, color: Colors.blue)),
TextSpan(
text: shjg,
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold,
color: shjg == hyc_text ? Colors.red : Colors.green)),
TextSpan(
text: ',' + content,
style: TextStyle(fontSize: 18.0, color: Colors.blue)),
]),
),
),
),
SizedBox(height: 0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
RaisedButton(
onPressed: () async {
ret = true;
Navigator.pop(context, ret); //关闭弹框,返回sRet
},
child: Text("确认"),
),
RaisedButton(
child: Text("取消"),
onPressed: () async {
Navigator.pop(context, ret); //关闭弹框,返回sRet
},
)
],
),
],
),
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
Navigator.pop(context, ret);
},
);
}
}
+340
View File
@@ -0,0 +1,340 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
import 'package:flutter/services.dart';
import 'package:fluttertoast/fluttertoast.dart';
import '../pages/Works/SBBJ/sbbj_content.dart';
import 'doJSON.dart';
//删除消息对话框。自定义透明背景窗口,类似对话框
class CustomDialogJ extends StatefulWidget {
CustomDialogJ({Key key, this.title = "", this.theKey = "", this.index = -1}) : super(key: key);
String title;
String theKey;
int index;
_CheckBoxDemoState createState() => _CheckBoxDemoState();
}
//需要监听软键盘的弹出和隐藏 主要用 WidgetsBindingObserver 这个继承类
//https://www.jianshu.com/p/872e23124470
class _CheckBoxDemoState extends State<CustomDialogJ> with WidgetsBindingObserver {
String getTitle(int index) {}
int mapLen = 0;
@override
void dispose() {
// TODO: implement dispose
//销毁
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void initState() {
// TODO: implement initState
super.initState();
//mapLen = mapGetSbbjGetData.length;
print("mapLen = $mapLen");
getContent();
//初始化
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeMetrics() {
super.didChangeMetrics();
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() {
if (MediaQuery.of(context).viewInsets.bottom == 0) {
//关闭键盘
bViewInsets = false;
} else {
//显示键盘
bViewInsets = true;
}
});
});
}
String strContent = '';
bool bModifiable = false;
bool bViewInsets = false;
getContent() async {
// strContent = ("" == mapGetSbbjGetData[widget.theKey].toString())
// ? "(无数据)"
// : mapGetSbbjGetData[widget.theKey].toString();
// widget.title =
// "第 ${widget.index + 1} 项(共 ${mapLen} 项) : " + mapGetSbbjGetDataText[widget.theKey];
getPreBtn_NextBtn();
//时间戳转换
if(strContent.isNotEmpty && ('addtime' == widget.theKey || 'createtime' == widget.theKey)) {
strContent = getDate(int.parse(strContent));
}
myController.text = strContent;
bModifiable = false;//mapGetSbbjGetDataModifiable[widget.thekey];
setState(() {});
}
Widget getBtnSizeX({@required text, width = 60.0, height = 30.0, onPressedFun}) {
return Container(
color: Colors.white12, //onPressedFun为null时无效
width: width,
height: height,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text(text),
onPressed: onPressedFun,
),
);
}
Future<bool> alertDialog(String title, String content, var onPresse) async {
return await showDialog(
barrierDismissible: false, //表示点击灰色背景的时候是否消失弹出框
context: context,
builder: (context) {
return AlertDialog(
title: Text(title),
content: Text(content),
actions: <Widget>[
FlatButton(
child: Text("确定"),
onPressed: onPresse,
),
FlatButton(
child: Text("取消"),
onPressed: () {
Navigator.pop(context, false);
},
),
],
);
},
);
}
//解决第一次进入报错问题。因为getPreBtn_NextBtn()还未执行,preBtn和nextBtn为空
Widget preBtn = Container(
color: Colors.white12, //onPressedFun为null时无效
width: 60.0,
height: 30.0,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text('上一项'),
onPressed: null,
),
);
Widget nextBtn = Container(
color: Colors.white12, //onPressedFun为null时无效
width: 60.0,
height: 30.0,
child: RaisedButton(
padding: EdgeInsets.all(0),
textColor: Colors.black,
child: Text('下一项'),
onPressed: null,
),
);
getPreBtn_NextBtn() {
preBtn = getBtnSizeX(
text: "上一项",
onPressedFun: null,
);
nextBtn = getBtnSizeX(
text: "下一项",
onPressedFun: null,
);
if (widget.index > 0 && mapLen > 0) {
preBtn = getBtnSizeX(
text: "上一项",
onPressedFun: () async {
if (widget.index > 0) {
widget.index--;
//widget.theKey = mapGetSbbjGetData.keys.elementAt(widget.index);
getContent();
}
},
);
}
if (widget.index < (mapLen - 1) && mapLen > 0) {
nextBtn = getBtnSizeX(
text: "下一项",
onPressedFun: () async {
if (widget.index < mapLen - 1) {
widget.index++;
//widget.theKey = mapGetSbbjGetData.keys.elementAt(widget.index);
getContent();
}
},
);
}
}
@override
Widget build(BuildContext context) {
SystemUiOverlayStyle(statusBarColor: Colors.transparent);
Size mediaSize = MediaQuery.of(context).size;
// TODO: implement build
return WillPopScope(
child: Scaffold(
//type: MaterialType.transparency,
//color: Colors.transparent,
//backgroundColor: Colors.transparent,
//color: Colors.blue,
backgroundColor: Color.fromRGBO(212, 212, 212, 0.6),
body: SafeArea(
child: Stack(
children: <Widget>[
Container(
alignment: Alignment(0, 0.2),
child: Container(
height: bViewInsets ? mediaSize.height * 0.4 : mediaSize.height * 0.85,
width: mediaSize.width * 0.95,
decoration: BoxDecoration(
color: Colors.white,
//border: Border.all(width: 1.0, color: Colors.black),
borderRadius: BorderRadius.all(
Radius.circular(3),
),
),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(10, 10, 10, 0),
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.centerLeft,
child: Text(
" ${widget.title}",
style: TextStyle(
fontSize: 15.0,
),
),
),
Align(
alignment: Alignment.centerRight,
child: InkWell(
child: Icon(Icons.close),
onTap: () {
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
)
],
),
),
Divider(),
Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
child: Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.0, color: Colors.blue),
borderRadius: BorderRadius.all(
Radius.circular(3),
),
),
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
width: double.infinity,
height: mediaSize.height * 0.15,
child: SingleChildScrollView(
child: Container(
child: TextField(
//textAlign: TextAlign.right,
keyboardType: TextInputType.multiline,
maxLines: 5,
minLines: 1,
style: TextStyle(fontSize: 14),
decoration: InputDecoration(
hintText: '請輸入字段信息',
border: InputBorder.none, //TextField去掉下划线
contentPadding: EdgeInsets.only(right: 0),
),
controller: myController,
enabled: bModifiable,
//利用控制器初始化文本
onChanged: (value) {},
),
),
),
),
),
SizedBox(height: 5),
bViewInsets
? SizedBox(height: 0)
: Container(
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
width: double.infinity,
child: Container(
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.0, color: Colors.blue),
borderRadius: BorderRadius.all(
Radius.circular(3),
),
),
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
width: double.infinity,
height: mediaSize.height * 0.45,
child: SingleChildScrollView(
child: Container(
//child: Text(strContent),
child: Text(strContent),
),
),
),
),
Expanded(
child: Container(),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
getBtnSizeX(
text: "复制",
onPressedFun: () {
// Flutter 复制文本到剪贴板
Clipboard.setData(ClipboardData(text: strContent));
//showToast('帮助信息已复制到剪贴板', textAlign: TextAlign.left);
Fluttertoast.showToast(
msg: '联系人信息已复制到剪贴板', gravity: ToastGravity.BOTTOM);
},
),
getBtnSizeX(
text: "返回",
onPressedFun: () {
Navigator.pop(context); //关闭弹框,播放输入视频地址
},
),
preBtn,
nextBtn,
],
),
SizedBox(height: 35),
],
),
),
),
],
),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
//player.pause();
Navigator.pop(context);
},
);
}
}
+27
View File
@@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'commonFun.dart';
//等待对话框
class CustomDialogWait extends Dialog {
String title;
bool ret = false;
CustomDialogWait({this.title = ""});
@override
Widget build(BuildContext context) {
Size mediaSize = MediaQuery.of(context).size;
return WillPopScope(
child: Material(
type: MaterialType.transparency,
child: Container(
child: getMoreWidget(text: title),
),
),
onWillPop: () {
// 屏蔽点击返回键的操作
Navigator.pop(context, ret);
},
);
}
}
+44
View File
@@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
//自定义图标按钮组件,顶部工具栏用
class MyIcontButton extends StatelessWidget {
var pressed;
double width;
double height;
double iconSize;
Color color;
Color iconColor;
double radius;
IconData icon;
MyIcontButton({
this.width = 30,
this.height = 30,
this.iconSize = 20,
this.color = Colors.blue,
this.iconColor = Colors.white,
this.radius = 0,
this.icon = Icons.message,
this.pressed = null,
});
@override
Widget build(BuildContext context) {
return Container(
height: this.height,
width: this.width,
decoration: BoxDecoration(
color: this.color,
border: Border.all(color: Colors.blue, width: 1.0),
borderRadius: BorderRadius.all(
Radius.circular(radius),
)),
child: IconButton(
color: Colors.white,
padding: EdgeInsets.all(0),
iconSize: this.iconSize,
icon: Icon(this.icon),
onPressed: this.pressed,
),
);
}
}
File diff suppressed because it is too large Load Diff
+178
View File
@@ -0,0 +1,178 @@
//JSON数据写入文件、从文件中读取
import 'dart:convert';
import 'dart:io';
import 'package:intl/intl.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart';
//控制字段处理数据类
class ItemData {
ItemData({
this.fieldName,
this.fieldText,
this.fieldVisible,
this.fieldModifiable,
this.fieldUrlVisible,
}) {}
String fieldName = '';
String fieldText = '';
bool fieldVisible = true;
bool fieldUrlVisible = true;
bool fieldModifiable = true;
}
//ftpdir 字符串 必须 上传目录,为checkid记录的抓拍时间,格式为4位年+2位月+2位日,如:20210208
//timeStamp可以是int类型或String类型的时间戳(秒)
String getFtpdir_YYYYMMDD(var timeStamp, {String sep = ''}) {
int timeStampSecond;
if (timeStamp is String) {
timeStampSecond = int.parse(timeStamp);
} else {
timeStampSecond = timeStamp;
}
//将拿到的时间戳转化为日期
DateTime _dateTime = DateTime.fromMillisecondsSinceEpoch(timeStampSecond * 1000, isUtc: true);
print('_dateTime = $_dateTime');
//_dateTime_now = 2021-02-08 20:31:31.235300
print('formattedDateYYYY_MM_DD_KK_MM = ${DateFormat('yyyy-MM-dd – kk:mm').format(_dateTime)}');
//formattedDateYYYY_MM_DD_KK_MM = 2021-01-31 – 06:49
String formattedDateYYYYMMDD = DateFormat('yyyy${sep}MM${sep}dd').format(_dateTime);
print('formattedDateYYYYMMDD = ${formattedDateYYYYMMDD}');
//formattedDateYYYYMMDD = 20210131
return formattedDateYYYYMMDD;
}
// 获得前 31 天的日期起点和终点:['2021-03-18', '2021-04-17']
List getLast31DateString() {
var _nowTime = DateTime.now();
String _nowDate_YYYY_MM_DD = DateFormat('yyyy-MM-dd').format(_nowTime);
//print('_nowDate_YYYY_MM_DD = ${_nowDate_YYYY_MM_DD}');
var _startTime = _nowTime.add(new Duration(days: -31));
String _startDate_YYYY_MM_DD = DateFormat('yyyy-MM-dd').format(_startTime);
print('_startDate_YYYY_MM_DD = ${_startDate_YYYY_MM_DD}');
var _endTime = _nowTime.add(new Duration(days: -1));
String _endDate_YYYY_MM_DD = DateFormat('yyyy-MM-dd').format(_endTime);
print('_endDate_YYYY_MM_DD = ${_endDate_YYYY_MM_DD}');
return [_startDate_YYYY_MM_DD, _endDate_YYYY_MM_DD];
}
///获取昨天的结束时间的秒时间戳
int getEndDayOfYesterdayStamp() {
var nowTime = DateTime.now();
var yesterday = nowTime.add(new Duration(days: -1));
var day = new DateTime(yesterday.year, yesterday.month, yesterday.day, 23, 59, 59);
//return day.microsecondsSinceEpoch; //微妙时间戳
//return day.millisecondsSinceEpoch; //毫秒时间戳
return day.millisecondsSinceEpoch ~/ 1000; //秒时间戳,加 ~ 为取整
}
///判断字符串时间是否是今日时间
bool isToday(String strTime) {
//5.字符串转DateTime,DateTime.parse('2019-11-08') 或者 DateTime.parse('2019-11-08 12:30:05')
DateTime _dateTime = DateTime.parse(strTime);
//return day.microsecondsSinceEpoch; //微妙时间戳
//return day.millisecondsSinceEpoch; //毫秒时间戳
int _secondTiem = _dateTime.millisecondsSinceEpoch ~/ 1000; //秒时间戳,加 ~ 为取整
return _secondTiem > getEndDayOfYesterdayStamp();
}
///从字符串时间获取秒时间戳
int getStampFromString(String strTime) {
//5.字符串转DateTime,DateTime.parse('2019-11-08') 或者 DateTime.parse('2019-11-08 12:30:05')
var _dateTime = DateTime.parse(strTime);
//return day.microsecondsSinceEpoch; //微妙时间戳
//return day.millisecondsSinceEpoch; //毫秒时间戳
return _dateTime.millisecondsSinceEpoch ~/ 1000; //秒时间戳,加 ~ 为取整
}
///获取字符串时间 Ntime (HH:MM)中时间的秒数
int getSecondsOfNtime(String Ntime) {
List list = Ntime.split(':');
int seconds = (int.parse(list[0]) * 60 + int.parse(list[1])) * 60;
return seconds; //秒时间戳,加 ~ 为取整
}
//mantissa尾数
String getDate(var timeStamp, {bool mantissa = false}) {
//String getDate(int timeStamp, {bool mantissa = false}) {
if (timeStamp == null) {
return "null";
}
if (timeStamp is String) {
return timeStamp;
}
//接口获得的时间戳是以秒为单位的
//flutter 时间戳转换 差8小时。可能是因为默认时区的问题,导致并不是北京时间。(我猜的。。。)
// 【解决办法】 // 在utc上直接加上8小时(28800秒)。
//var strtime = DateTime.fromMillisecondsSinceEpoch((timeStamp + 28800) * 1000); //将拿到的时间戳转化为日期
//Android Studio ADV默认是Use network-provided time zone,时区是GTM+00:00
//需要指定时区为China-Shanghai,China Time(GMT+08:00)
var strtime = DateTime.fromMillisecondsSinceEpoch(timeStamp * 1000, isUtc: true); //将拿到的时间戳转化为日期
String date = strtime.toLocal().toString();
//print('date = $date');
if (!mantissa) {
//去除末尾小数
date = date.substring(0, date.lastIndexOf('.'));
}
//print('date = $date'); //date = 2021-05-29 13:52:40
return date;
}
writeJSON(String jsonContent, String fileName) async {
File file = await getTheFile(fileName);
await file.writeAsString(jsonEncode(jsonContent));
}
Future<String> readJSON(String fileName) async {
return jsonDecode(await (await getTheFile(fileName)).readAsString());
}
Future<File> getTheFile(String fileName) async {
String strExt = path.extension(fileName).toLowerCase().trim();
if (0 != strExt.compareTo('.json')) {
fileName += '.json';
}
//在指定位置创建"json"目录
//final dirPath = await getExternalStorageDirectory();
final dirPath = await getApplicationDocumentsDirectory();
var dirJson = Directory(dirPath.path + "/" + "json");
try {
bool exists = await dirJson.exists();
if (!exists) {
await dirJson.create();
}
} catch (e) {
print(e);
}
// /data/data/com.flutter.hyzp_ybqx/app_flutter/json/listMessagesInbox02.json
// /data/data/com.flutter.hyzp_ybqx/app_flutter/json/listContacts02.json
return File('${(await getApplicationDocumentsDirectory()).path}/json/$fileName');
}
//以下为测试学习之用
// Future<File> get getFile async {
// File('${(await getApplicationDocumentsDirectory()).path}/json/listContacts.json');
// }
// writeJSON(String jsonContent) async {
// //You can write data like this:
// //await (await getFile).writeAsString(jsonEncode(jsonContent));
// //该句等同于
// File file = await getFile;
// await file.writeAsString(jsonEncode(jsonContent));
// }
//
// readJSON() async {
// //从文件中读取,下次您可能想读取更改的数据。你可以这样做:
// String decodedContent = jsonDecode(await (await getFile).readAsString());
// }
File diff suppressed because it is too large Load Diff
+34
View File
@@ -0,0 +1,34 @@
import 'dart:io';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
class StorageDataToFile {
static Future<String> get _localPath async {
final _path = await getTemporaryDirectory();
return _path.path;
}
static Future<File> get _localFile async {
final path = await _localPath;
return File('$path/counter.txt');
}
static Future<int> readCounter() async {
try {
final file = await _localFile;
var contents = await file.readAsString();
return int.parse(contents);
} catch (e) {
return 0;
}
}
static Future<File> writeCounter(counter) async {
final file = await _localFile;
return file.writeAsString('$counter');
}
}
+3
View File
@@ -0,0 +1,3 @@
class Config{
static String domain="http://jd.itying.com/";
}
+129
View File
@@ -0,0 +1,129 @@
//const serviceUrl= 'http://v.jspang.com:8088/baixing/';
//const serviceUrl= 'http://test.baixingliangfan.cn/baixing/';
//http://10.2.10.141:7300/mock/5fbb7f720e0cfd151c87e9f2/hyzp_ybqx/user/login
// const serviceUrl =
// 'http://10.2.10.141:7300/mock/5fbb7f720e0cfd151c87e9f2/hyzp_ybqx/';
//20210109又换回该地址
//const ServiceUrl = 'http://49.235.208.235:9001/';
//20210123更换为该地址
//http://125.64.218.67:9904/docs.php
const ServiceUrl = 'http://125.64.218.67:9904/';
//图片视频需要添加前缀:http://125.64.218.67:9908
const ServiceMediaUrl = 'http://125.64.218.67:9908/';
//20201222更换为该地址
//http://125.64.218.67:9901/docs.php
//const ServiceUrl = 'http://125.64.218.67:9901/';
const ServiceUrlJd = 'http://jd.itying.com/imgupload/';
///点位视频(Dwsp)接口Url
const ServiceDwspUrl = 'http://125.64.218.67:9901';
class ServicePath {
///用户登录相关接口
static const String loginUrl = ServiceUrl + '?s=App.User_User.Login'; //用户名登录
static const String modifyPwUrl = ServiceUrl + '?s=App.User_User.Cpass'; //根据账号和原密码进行修改密码操作
static const String loginStateUrl = ServiceUrl + '?s=App.User_User.CheckSession';
static const String getUserInfoUrl = ServiceUrl + '?s=App.User_User.Profile'; //获取我的个人信息
static const String uploadImageUrl = ServiceUrl + '?s=App.Car_Upload.Pic'; //上传黑烟图片
///人脸注册和登录相关接口
static const String uploadFaceregUrl = ServiceUrl + '?s=App.User_User.Facereg'; //人脸注册接口
static const String uploadFaceloginUrl = ServiceUrl + '?s=App.User_User.Facelogin'; //人脸识别登录接口
static const String getUserListUrl = ServiceUrl + '?s=App.User_User.GetUserList'; //获取用户分页列表数据
///用户权限管理
static const String getUserAccessUrl =
ServiceUrl + '?s=App.User_User.GetAccess'; //1、根据用户ID获取用户所属角色
static const String getUserGroupUrl = ServiceUrl + '?s=App.User_User.GetGroup'; //2、获取后台用户角色分组数据
static const String getUserGroupListUrl =
ServiceUrl + '?s=App.User_User.GetGroupList'; //3、获取后台用户角色分组分页列表数据
static const String getUserAuthUrl = ServiceUrl + '?s=App.User_User.GetAuth'; //4、获取后台功能分类数据
static const String getUserAuthListUrl =
ServiceUrl + '?s=App.User_User.GetAuthList'; //5、获取后台功能分类分页列表数据
///违章信息数据相关接口
// static const String getWzxxGetDataUrl = ServiceUrl + '?s=App.Car_Yjxx.Get'; //获取违章信息单条数据
// static const String getWzxxGetAllUrl = ServiceUrl + '?s=App.Car_Yjxx.GetAll'; //获取违章信息全部分页列表数据
// static const String getWzxxGetListUrl = ServiceUrl + '?s=App.Car_Yjxx.GetList'; //获取违章信息分页列表数据
// static const String auditWzxxUrl = ServiceUrl + '?s=App.Car_Yjxx.Workflow'; //违章信息审核
static const String getWzxxGetDataUrl = ServiceUrl + '?s=App.Car_Hyc.Get'; //获取违章信息单条数据
static const String getWzxxGetAllUrl = ServiceUrl + '?s=App.Car_Hyc.GetAll'; //获取违章信息全部分页列表数据
static const String getWzxxGetListUrl = ServiceUrl + '?s=App.Car_Hyc.GetList'; //获取违章信息分页列表数据
static const String updateWzxxUrl = ServiceUrl + '?s=App.Car_Yjxx.Update'; //违章信息更新
////违章信息审核相关接口
static const String auditWzxxUrl = ServiceUrl + '?s=App.Car_Hyc.Workflow'; //违章信息审核
static const String getShenheUrl = ServiceUrl + '?s=App.Car_Hyc.GetShenhe'; //获取审核信息
static const String getNtimeUrl = ServiceUrl + '?s=App.Car_Hyc.GetNtime'; //获取违章间隔时间数据
static const String tsjjGetTsStatus = ServiceUrl + '?s=App.Car_Hyc.GetTs'; //获取推送交警状态信息
static const String tsjjFtpUpftpUrl = ServiceUrl + '?s=App.Car_Ftp.Upftp'; //向交警服务器推送数据
static const String tsjjFtpUptsztUrl = ServiceUrl + '?s=App.Car_Ftp.Uptszt'; //回写推送交警状态
///Zpjl为抓拍记录缩写
static const String getZpjlGetUrl = ServiceUrl + '?s=App.Car_Yjxx.Get'; //根据ID获取对应抓拍记录列表数据
static const String getZpjlGetAllUrl = ServiceUrl + '?s=App.Car_Yjxx.GetAll'; //获取全部抓拍记录分页列表数据
static const String getZpjlGetListUrl =
ServiceUrl + '?s=App.Car_Yjxx.GetList'; //根据审核状态获取抓拍记录分页列表数据
///获取设备信息接口
static const String getSbbjGetListUrl = ServiceUrl + '?s=App.Car_Bjxx.GetList'; //获取设备报警信息分页列表数据
static const String getSbbjGetUrl = ServiceUrl + '?s=App.Car_Bjxx.Get'; //获取设备报警信息单条数据
static const String auditSbbjUrl = ServiceUrl + '?s=App.Car_Bjxx.Workflow'; //核查处理设备报警信息
static const String getMachineGetListUrl =
ServiceUrl + '?s=App.Car_Machine.GetList'; //获取设备管理信息分页列表数据
//http://125.64.218.67:9901/?s=App.Car_Sbbj.GetList
static const String getMachineGetDataUrl = ServiceUrl + '?s=App.Car_Machine.Get'; //获取设备管理信息单条数据
///LED字幕信息
static const String getLedXsxxGetListUrl =
ServiceUrl + '?s=App.Car_Led.GetList'; //获取LED显示信息分页列表数据
static const String getLedXsxxGetUrl = ServiceUrl + '?s=App.Car_Led.Get'; //获取LED信息单条数据
//static const String insertLedXsxxUrl = ServiceUrl + '?s=App.Car_Led.Insert'; //添加LED字幕,已取消该接口
static const String updateLedXsxxGetUrl = ServiceUrl + '?s=App.Car_Led.Update'; //更新LED数据
///点位信息
static const String getDwinfoGetListUrl = ServiceUrl + '?s=App.Car_Dwinfo.GetList'; //获取点位信息分页列表数据
///统计信息
static const String getStaYjxxUrl = ServiceUrl + '?s=App.Car_Statis.GetStaYjxx'; //获取抓拍统计数据
static const String getStaHycUrl = ServiceUrl + '?s=App.Car_Statis.GetStaHyc'; //获取审核黑烟车统计数据
static const String getStaCllUrl = ServiceUrl + '?s=App.Car_Statis.GetStaCll'; //获取车流量统计数据
static const String getStaAllUrl = ServiceUrl + '?s=App.Car_Statis.GetStaAll'; //获取今日所有统计数据
static const String getRStaCllUrl =
ServiceUrl + '?s=App.Car_Statis.GetStaView'; //获取车流量日统计数据(含早晚高峰)
///点位视频(Dwsp)播放
//1、系统登录
static const String getDwspLoginUrl = ServiceDwspUrl + '/api/v1/system/login';
//2、获取设备列表
static const String getDwspDeviceListUrl = ServiceDwspUrl + '/api/v1/device/list';
//'http://125.64.218.67:9908/api/v1/device/list'
//3、根据设备ID获取实时直播接口 - 开始实时直播
static const String getDwspStartRtmpUrl = ServiceDwspUrl + '/api/v1/stream/start';
//4、开始实时直播
static const String getDwspStopRtmpUrl = ServiceDwspUrl + '/api/v1/stream/stop'; //5、关闭实时直播
///测试用,获取点位视频播放地址,类似 'http://125.64.218.67:9908/rtmp/1.php'
///const ServiceMediaUrl = 'http://125.64.218.67:9908/';
static const String getDwspUrl = ServiceMediaUrl + 'rtmp/';
//5、球机方向控制接口说明:
// 接口地址:http://125.64.218.67:9906/api/ptz/{通道ID}/{球机ID}
static const String setSphericalCameraUrl = 'http://125.64.218.67:9906/api/ptz/'; //球机方向控制接口
//6、获取 Apk 下载地址
// api = http://sctastech.com/download/index.html
// http://www.sctastech.com/download/hyzp_20210425.apk
// 接口地址:http://sctastech.com/download/index.html
static const String getVerUrl = ServiceUrl + '?s=App.Car_Ver.Getver'; //获取最新版本号
}
+5
View File
@@ -0,0 +1,5 @@
# ListView列表组件 - 示例
|1. [Antd图标](./antd_icons.dart)|
|----|
|<img width="265" src="./screen_shots/antd_icons.png"/>|
+995
View File
@@ -0,0 +1,995 @@
import 'package:flutter/material.dart';
final List<IconData> iconList = [
// Generated code: do not hand-edit.,
// See https://github.com/flutter/flutter/wiki/Updating-Material-Design-Fonts,
// BEGIN GENERATED,
Icons.threesixty,
Icons.threed_rotation,
Icons.four_k,
Icons.ac_unit,
Icons.access_alarm,
Icons.access_alarms,
Icons.access_time,
Icons.accessibility,
Icons.accessibility_new,
Icons.accessible,
Icons.accessible_forward,
Icons.account_balance,
Icons.account_balance_wallet,
Icons.account_box,
Icons.account_circle,
Icons.adb,
Icons.add,
Icons.add_a_photo,
Icons.add_alarm,
Icons.add_alert,
Icons.add_box,
Icons.add_call,
Icons.add_circle,
Icons.add_circle_outline,
Icons.add_comment,
Icons.add_location,
Icons.add_photo_alternate,
Icons.add_shopping_cart,
Icons.add_to_home_screen,
Icons.add_to_photos,
Icons.add_to_queue,
Icons.adjust,
Icons.airline_seat_flat,
Icons.airline_seat_flat_angled,
Icons.airline_seat_individual_suite,
Icons.airline_seat_legroom_extra,
Icons.airline_seat_legroom_normal,
Icons.airline_seat_legroom_reduced,
Icons.airline_seat_recline_extra,
Icons.airline_seat_recline_normal,
Icons.airplanemode_active,
Icons.airplanemode_inactive,
Icons.airplay,
Icons.airport_shuttle,
Icons.alarm,
Icons.alarm_add,
Icons.alarm_off,
Icons.alarm_on,
Icons.album,
Icons.all_inclusive,
Icons.all_out,
Icons.alternate_email,
Icons.android,
Icons.announcement,
Icons.apps,
Icons.archive,
Icons.arrow_back,
Icons.arrow_back_ios,
Icons.arrow_downward,
Icons.arrow_drop_down,
Icons.arrow_drop_down_circle,
Icons.arrow_drop_up,
Icons.arrow_forward,
Icons.arrow_forward_ios,
Icons.arrow_left,
Icons.arrow_right,
Icons.arrow_upward,
Icons.art_track,
Icons.aspect_ratio,
Icons.assessment,
Icons.assignment,
Icons.assignment_ind,
Icons.assignment_late,
Icons.assignment_return,
Icons.assignment_returned,
Icons.assignment_turned_in,
Icons.assistant,
Icons.assistant_photo,
Icons.atm,
Icons.attach_file,
Icons.attach_money,
Icons.attachment,
Icons.audiotrack,
Icons.autorenew,
Icons.av_timer,
Icons.backspace,
Icons.backup,
Icons.battery_alert,
Icons.battery_charging_full,
Icons.battery_full,
Icons.battery_std,
Icons.battery_unknown,
Icons.beach_access,
Icons.beenhere,
Icons.block,
Icons.bluetooth,
Icons.bluetooth_audio,
Icons.bluetooth_connected,
Icons.bluetooth_disabled,
Icons.bluetooth_searching,
Icons.blur_circular,
Icons.blur_linear,
Icons.blur_off,
Icons.blur_on,
Icons.book,
Icons.bookmark,
Icons.bookmark_border,
Icons.border_all,
Icons.border_bottom,
Icons.border_clear,
Icons.border_color,
Icons.border_horizontal,
Icons.border_inner,
Icons.border_left,
Icons.border_outer,
Icons.border_right,
Icons.border_style,
Icons.border_top,
Icons.border_vertical,
Icons.branding_watermark,
Icons.brightness_1,
Icons.brightness_2,
Icons.brightness_3,
Icons.brightness_4,
Icons.brightness_5,
Icons.brightness_6,
Icons.brightness_7,
Icons.brightness_auto,
Icons.brightness_high,
Icons.brightness_low,
Icons.brightness_medium,
Icons.broken_image,
Icons.brush,
Icons.bubble_chart,
Icons.bug_report,
Icons.build,
Icons.burst_mode,
Icons.business,
Icons.business_center,
Icons.cached,
Icons.cake,
Icons.calendar_today,
Icons.calendar_view_day,
Icons.call,
Icons.call_end,
Icons.call_made,
Icons.call_merge,
Icons.call_missed,
Icons.call_missed_outgoing,
Icons.call_received,
Icons.call_split,
Icons.call_to_action,
Icons.camera,
Icons.camera_alt,
Icons.camera_enhance,
Icons.camera_front,
Icons.camera_rear,
Icons.camera_roll,
Icons.cancel,
Icons.card_giftcard,
Icons.card_membership,
Icons.card_travel,
Icons.casino,
Icons.cast,
Icons.cast_connected,
Icons.category,
Icons.center_focus_strong,
Icons.center_focus_weak,
Icons.change_history,
Icons.chat,
Icons.chat_bubble,
Icons.chat_bubble_outline,
Icons.check,
Icons.check_box,
Icons.check_box_outline_blank,
Icons.check_circle,
Icons.check_circle_outline,
Icons.chevron_left,
Icons.chevron_right,
Icons.child_care,
Icons.child_friendly,
Icons.chrome_reader_mode,
Icons.class_,
Icons.clear,
Icons.clear_all,
Icons.close,
Icons.closed_caption,
Icons.cloud,
Icons.cloud_circle,
Icons.cloud_done,
Icons.cloud_download,
Icons.cloud_off,
Icons.cloud_queue,
Icons.cloud_upload,
Icons.code,
Icons.collections,
Icons.collections_bookmark,
Icons.color_lens,
Icons.colorize,
Icons.comment,
Icons.compare,
Icons.compare_arrows,
Icons.computer,
Icons.confirmation_number,
Icons.contact_mail,
Icons.contact_phone,
Icons.contacts,
Icons.content_copy,
Icons.content_cut,
Icons.content_paste,
Icons.control_point,
Icons.control_point_duplicate,
Icons.copyright,
Icons.create,
Icons.create_new_folder,
Icons.credit_card,
Icons.crop,
Icons.crop_16_9,
Icons.crop_3_2,
Icons.crop_5_4,
Icons.crop_7_5,
Icons.crop_din,
Icons.crop_free,
Icons.crop_landscape,
Icons.crop_original,
Icons.crop_portrait,
Icons.crop_rotate,
Icons.crop_square,
Icons.dashboard,
Icons.data_usage,
Icons.date_range,
Icons.dehaze,
Icons.delete,
Icons.delete_forever,
Icons.delete_outline,
Icons.delete_sweep,
Icons.departure_board,
Icons.description,
Icons.desktop_mac,
Icons.desktop_windows,
Icons.details,
Icons.developer_board,
Icons.developer_mode,
Icons.device_hub,
Icons.device_unknown,
Icons.devices,
Icons.devices_other,
Icons.dialer_sip,
Icons.dialpad,
Icons.directions,
Icons.directions_bike,
Icons.directions_boat,
Icons.directions_bus,
Icons.directions_car,
Icons.directions_railway,
Icons.directions_run,
Icons.directions_subway,
Icons.directions_transit,
Icons.directions_walk,
Icons.disc_full,
Icons.dns,
Icons.do_not_disturb,
Icons.do_not_disturb_alt,
Icons.do_not_disturb_off,
Icons.do_not_disturb_on,
Icons.dock,
Icons.domain,
Icons.done,
Icons.done_all,
Icons.done_outline,
Icons.donut_large,
Icons.donut_small,
Icons.drafts,
Icons.drag_handle,
Icons.drive_eta,
Icons.dvr,
Icons.edit,
Icons.edit_attributes,
Icons.edit_location,
Icons.eject,
Icons.email,
Icons.enhanced_encryption,
Icons.equalizer,
Icons.error,
Icons.error_outline,
Icons.euro_symbol,
Icons.ev_station,
Icons.event,
Icons.event_available,
Icons.event_busy,
Icons.event_note,
Icons.event_seat,
Icons.exit_to_app,
Icons.expand_less,
Icons.expand_more,
Icons.explicit,
Icons.explore,
Icons.exposure,
Icons.exposure_neg_1,
Icons.exposure_neg_2,
Icons.exposure_plus_1,
Icons.exposure_plus_2,
Icons.exposure_zero,
Icons.extension,
Icons.face,
Icons.fast_forward,
Icons.fast_rewind,
Icons.fastfood,
Icons.favorite,
Icons.favorite_border,
Icons.featured_play_list,
Icons.featured_video,
Icons.feedback,
Icons.fiber_dvr,
Icons.fiber_manual_record,
Icons.fiber_new,
Icons.fiber_pin,
Icons.fiber_smart_record,
Icons.file_download,
Icons.file_upload,
Icons.filter,
Icons.filter_1,
Icons.filter_2,
Icons.filter_3,
Icons.filter_4,
Icons.filter_5,
Icons.filter_6,
Icons.filter_7,
Icons.filter_8,
Icons.filter_9,
Icons.filter_9_plus,
Icons.filter_b_and_w,
Icons.filter_center_focus,
Icons.filter_drama,
Icons.filter_frames,
Icons.filter_hdr,
Icons.filter_list,
Icons.filter_none,
Icons.filter_tilt_shift,
Icons.filter_vintage,
Icons.find_in_page,
Icons.find_replace,
Icons.fingerprint,
Icons.first_page,
Icons.fitness_center,
Icons.flag,
Icons.flare,
Icons.flash_auto,
Icons.flash_off,
Icons.flash_on,
Icons.flight,
Icons.flight_land,
Icons.flight_takeoff,
Icons.flip,
Icons.flip_to_back,
Icons.flip_to_front,
Icons.folder,
Icons.folder_open,
Icons.folder_shared,
Icons.folder_special,
Icons.font_download,
Icons.format_align_center,
Icons.format_align_justify,
Icons.format_align_left,
Icons.format_align_right,
Icons.format_bold,
Icons.format_clear,
Icons.format_color_fill,
Icons.format_color_reset,
Icons.format_color_text,
Icons.format_indent_decrease,
Icons.format_indent_increase,
Icons.format_italic,
Icons.format_line_spacing,
Icons.format_list_bulleted,
Icons.format_list_numbered,
Icons.format_list_numbered_rtl,
Icons.format_paint,
Icons.format_quote,
Icons.format_shapes,
Icons.format_size,
Icons.format_strikethrough,
Icons.format_textdirection_l_to_r,
Icons.format_textdirection_r_to_l,
Icons.format_underlined,
Icons.forum,
Icons.forward,
Icons.forward_10,
Icons.forward_30,
Icons.forward_5,
Icons.free_breakfast,
Icons.fullscreen,
Icons.fullscreen_exit,
Icons.functions,
Icons.g_translate,
Icons.gamepad,
Icons.games,
Icons.gavel,
Icons.gesture,
Icons.get_app,
Icons.gif,
Icons.golf_course,
Icons.gps_fixed,
Icons.gps_not_fixed,
Icons.gps_off,
Icons.grade,
Icons.gradient,
Icons.grain,
Icons.graphic_eq,
Icons.grid_off,
Icons.grid_on,
Icons.group,
Icons.group_add,
Icons.group_work,
Icons.hd,
Icons.hdr_off,
Icons.hdr_on,
Icons.hdr_strong,
Icons.hdr_weak,
Icons.headset,
Icons.headset_mic,
Icons.headset_off,
Icons.healing,
Icons.hearing,
Icons.help,
Icons.help_outline,
Icons.high_quality,
Icons.highlight,
Icons.highlight_off,
Icons.history,
Icons.home,
Icons.hot_tub,
Icons.hotel,
Icons.hourglass_empty,
Icons.hourglass_full,
Icons.http,
Icons.https,
Icons.image,
Icons.image_aspect_ratio,
Icons.import_contacts,
Icons.import_export,
Icons.important_devices,
Icons.inbox,
Icons.indeterminate_check_box,
Icons.info,
Icons.info_outline,
Icons.input,
Icons.insert_chart,
Icons.insert_comment,
Icons.insert_drive_file,
Icons.insert_emoticon,
Icons.insert_invitation,
Icons.insert_link,
Icons.insert_photo,
Icons.invert_colors,
Icons.invert_colors_off,
Icons.iso,
Icons.keyboard,
Icons.keyboard_arrow_down,
Icons.keyboard_arrow_left,
Icons.keyboard_arrow_right,
Icons.keyboard_arrow_up,
Icons.keyboard_backspace,
Icons.keyboard_capslock,
Icons.keyboard_hide,
Icons.keyboard_return,
Icons.keyboard_tab,
Icons.keyboard_voice,
Icons.kitchen,
Icons.label,
Icons.label_important,
Icons.label_outline,
Icons.landscape,
Icons.language,
Icons.laptop,
Icons.laptop_chromebook,
Icons.laptop_mac,
Icons.laptop_windows,
Icons.last_page,
Icons.launch,
Icons.layers,
Icons.layers_clear,
Icons.leak_add,
Icons.leak_remove,
Icons.lens,
Icons.library_add,
Icons.library_books,
Icons.library_music,
Icons.lightbulb_outline,
Icons.line_style,
Icons.line_weight,
Icons.linear_scale,
Icons.link,
Icons.link_off,
Icons.linked_camera,
Icons.list,
Icons.live_help,
Icons.live_tv,
Icons.local_activity,
Icons.local_airport,
Icons.local_atm,
Icons.local_bar,
Icons.local_cafe,
Icons.local_car_wash,
Icons.local_convenience_store,
Icons.local_dining,
Icons.local_drink,
Icons.local_florist,
Icons.local_gas_station,
Icons.local_grocery_store,
Icons.local_hospital,
Icons.local_hotel,
Icons.local_laundry_service,
Icons.local_library,
Icons.local_mall,
Icons.local_movies,
Icons.local_offer,
Icons.local_parking,
Icons.local_pharmacy,
Icons.local_phone,
Icons.local_pizza,
Icons.local_play,
Icons.local_post_office,
Icons.local_printshop,
Icons.local_see,
Icons.local_shipping,
Icons.local_taxi,
Icons.location_city,
Icons.location_disabled,
Icons.location_off,
Icons.location_on,
Icons.location_searching,
Icons.lock,
Icons.lock_open,
Icons.lock_outline,
Icons.looks,
Icons.looks_3,
Icons.looks_4,
Icons.looks_5,
Icons.looks_6,
Icons.looks_one,
Icons.looks_two,
Icons.loop,
Icons.loupe,
Icons.low_priority,
Icons.loyalty,
Icons.mail,
Icons.mail_outline,
Icons.map,
Icons.markunread,
Icons.markunread_mailbox,
Icons.maximize,
Icons.memory,
Icons.menu,
Icons.merge_type,
Icons.message,
Icons.mic,
Icons.mic_none,
Icons.mic_off,
Icons.minimize,
Icons.missed_video_call,
Icons.mms,
Icons.mobile_screen_share,
Icons.mode_comment,
Icons.mode_edit,
Icons.monetization_on,
Icons.money_off,
Icons.monochrome_photos,
Icons.mood,
Icons.mood_bad,
Icons.more,
Icons.more_horiz,
Icons.more_vert,
Icons.motorcycle,
Icons.mouse,
Icons.move_to_inbox,
Icons.movie,
Icons.movie_creation,
Icons.movie_filter,
Icons.multiline_chart,
Icons.music_note,
Icons.music_video,
Icons.my_location,
Icons.nature,
Icons.nature_people,
Icons.navigate_before,
Icons.navigate_next,
Icons.navigation,
Icons.near_me,
Icons.network_cell,
Icons.network_check,
Icons.network_locked,
Icons.network_wifi,
Icons.new_releases,
Icons.next_week,
Icons.nfc,
Icons.no_encryption,
Icons.no_sim,
Icons.not_interested,
Icons.not_listed_location,
Icons.note,
Icons.note_add,
Icons.notification_important,
Icons.notifications,
Icons.notifications_active,
Icons.notifications_none,
Icons.notifications_off,
Icons.notifications_paused,
Icons.offline_bolt,
Icons.offline_pin,
Icons.ondemand_video,
Icons.opacity,
Icons.open_in_browser,
Icons.open_in_new,
Icons.open_with,
Icons.outlined_flag,
Icons.pages,
Icons.pageview,
Icons.palette,
Icons.pan_tool,
Icons.panorama,
Icons.panorama_fish_eye,
Icons.panorama_horizontal,
Icons.panorama_vertical,
Icons.panorama_wide_angle,
Icons.party_mode,
Icons.pause,
Icons.pause_circle_filled,
Icons.pause_circle_outline,
Icons.payment,
Icons.people,
Icons.people_outline,
Icons.perm_camera_mic,
Icons.perm_contact_calendar,
Icons.perm_data_setting,
Icons.perm_device_information,
Icons.perm_identity,
Icons.perm_media,
Icons.perm_phone_msg,
Icons.perm_scan_wifi,
Icons.person,
Icons.person_add,
Icons.person_outline,
Icons.person_pin,
Icons.person_pin_circle,
Icons.personal_video,
Icons.pets,
Icons.phone,
Icons.phone_android,
Icons.phone_bluetooth_speaker,
Icons.phone_forwarded,
Icons.phone_in_talk,
Icons.phone_iphone,
Icons.phone_locked,
Icons.phone_missed,
Icons.phone_paused,
Icons.phonelink,
Icons.phonelink_erase,
Icons.phonelink_lock,
Icons.phonelink_off,
Icons.phonelink_ring,
Icons.phonelink_setup,
Icons.photo,
Icons.photo_album,
Icons.photo_camera,
Icons.photo_filter,
Icons.photo_library,
Icons.photo_size_select_actual,
Icons.photo_size_select_large,
Icons.photo_size_select_small,
Icons.picture_as_pdf,
Icons.picture_in_picture,
Icons.picture_in_picture_alt,
Icons.pie_chart,
Icons.pie_chart_outlined,
Icons.pin_drop,
Icons.place,
Icons.play_arrow,
Icons.play_circle_filled,
Icons.play_circle_outline,
Icons.play_for_work,
Icons.playlist_add,
Icons.playlist_add_check,
Icons.playlist_play,
Icons.plus_one,
Icons.poll,
Icons.polymer,
Icons.pool,
Icons.portable_wifi_off,
Icons.portrait,
Icons.power,
Icons.power_input,
Icons.power_settings_new,
Icons.pregnant_woman,
Icons.present_to_all,
Icons.print,
Icons.priority_high,
Icons.public,
Icons.publish,
Icons.query_builder,
Icons.question_answer,
Icons.queue,
Icons.queue_music,
Icons.queue_play_next,
Icons.radio,
Icons.radio_button_checked,
Icons.radio_button_unchecked,
Icons.rate_review,
Icons.receipt,
Icons.recent_actors,
Icons.record_voice_over,
Icons.redeem,
Icons.redo,
Icons.refresh,
Icons.remove,
Icons.remove_circle,
Icons.remove_circle_outline,
Icons.remove_from_queue,
Icons.remove_red_eye,
Icons.remove_shopping_cart,
Icons.reorder,
Icons.repeat,
Icons.repeat_one,
Icons.replay,
Icons.replay_10,
Icons.replay_30,
Icons.replay_5,
Icons.reply,
Icons.reply_all,
Icons.report,
Icons.report_off,
Icons.report_problem,
Icons.restaurant,
Icons.restaurant_menu,
Icons.restore,
Icons.restore_from_trash,
Icons.restore_page,
Icons.ring_volume,
Icons.room,
Icons.room_service,
Icons.rotate_90_degrees_ccw,
Icons.rotate_left,
Icons.rotate_right,
Icons.rounded_corner,
Icons.router,
Icons.rowing,
Icons.rss_feed,
Icons.rv_hookup,
Icons.satellite,
Icons.save,
Icons.save_alt,
Icons.scanner,
Icons.scatter_plot,
Icons.schedule,
Icons.school,
Icons.score,
Icons.screen_lock_landscape,
Icons.screen_lock_portrait,
Icons.screen_lock_rotation,
Icons.screen_rotation,
Icons.screen_share,
Icons.sd_card,
Icons.sd_storage,
Icons.search,
Icons.security,
Icons.select_all,
Icons.send,
Icons.sentiment_dissatisfied,
Icons.sentiment_neutral,
Icons.sentiment_satisfied,
Icons.sentiment_very_dissatisfied,
Icons.sentiment_very_satisfied,
Icons.settings,
Icons.settings_applications,
Icons.settings_backup_restore,
Icons.settings_bluetooth,
Icons.settings_brightness,
Icons.settings_cell,
Icons.settings_ethernet,
Icons.settings_input_antenna,
Icons.settings_input_component,
Icons.settings_input_composite,
Icons.settings_input_hdmi,
Icons.settings_input_svideo,
Icons.settings_overscan,
Icons.settings_phone,
Icons.settings_power,
Icons.settings_remote,
Icons.settings_system_daydream,
Icons.settings_voice,
Icons.share,
Icons.shop,
Icons.shop_two,
Icons.shopping_basket,
Icons.shopping_cart,
Icons.short_text,
Icons.show_chart,
Icons.shuffle,
Icons.shutter_speed,
Icons.signal_cellular_4_bar,
Icons.signal_cellular_connected_no_internet_4_bar,
Icons.signal_cellular_no_sim,
Icons.signal_cellular_null,
Icons.signal_cellular_off,
Icons.signal_wifi_4_bar,
Icons.signal_wifi_4_bar_lock,
Icons.signal_wifi_off,
Icons.sim_card,
Icons.sim_card_alert,
Icons.skip_next,
Icons.skip_previous,
Icons.slideshow,
Icons.slow_motion_video,
Icons.smartphone,
Icons.smoke_free,
Icons.smoking_rooms,
Icons.sms,
Icons.sms_failed,
Icons.snooze,
Icons.sort,
Icons.sort_by_alpha,
Icons.spa,
Icons.space_bar,
Icons.speaker,
Icons.speaker_group,
Icons.speaker_notes,
Icons.speaker_notes_off,
Icons.speaker_phone,
Icons.spellcheck,
Icons.star,
Icons.star_border,
Icons.star_half,
Icons.stars,
Icons.stay_current_landscape,
Icons.stay_current_portrait,
Icons.stay_primary_landscape,
Icons.stay_primary_portrait,
Icons.stop,
Icons.stop_screen_share,
Icons.storage,
Icons.store,
Icons.store_mall_directory,
Icons.straighten,
Icons.streetview,
Icons.strikethrough_s,
Icons.style,
Icons.subdirectory_arrow_left,
Icons.subdirectory_arrow_right,
Icons.subject,
Icons.subscriptions,
Icons.subtitles,
Icons.subway,
Icons.supervised_user_circle,
Icons.supervisor_account,
Icons.surround_sound,
Icons.swap_calls,
Icons.swap_horiz,
Icons.swap_horizontal_circle,
Icons.swap_vert,
Icons.swap_vertical_circle,
Icons.switch_camera,
Icons.switch_video,
Icons.sync,
Icons.sync_disabled,
Icons.sync_problem,
Icons.system_update,
Icons.system_update_alt,
Icons.tab,
Icons.tab_unselected,
Icons.table_chart,
Icons.tablet,
Icons.tablet_android,
Icons.tablet_mac,
Icons.tag_faces,
Icons.tap_and_play,
Icons.terrain,
Icons.text_fields,
Icons.text_format,
Icons.text_rotate_up,
Icons.text_rotate_vertical,
Icons.text_rotation_angledown,
Icons.text_rotation_angleup,
Icons.text_rotation_down,
Icons.text_rotation_none,
Icons.textsms,
Icons.texture,
Icons.theaters,
Icons.thumb_down,
Icons.thumb_up,
Icons.thumbs_up_down,
Icons.time_to_leave,
Icons.timelapse,
Icons.timeline,
Icons.timer,
Icons.timer_10,
Icons.timer_3,
Icons.timer_off,
Icons.title,
Icons.toc,
Icons.today,
Icons.toll,
Icons.tonality,
Icons.touch_app,
Icons.toys,
Icons.track_changes,
Icons.traffic,
Icons.train,
Icons.tram,
Icons.transfer_within_a_station,
Icons.transform,
Icons.transit_enterexit,
Icons.translate,
Icons.trending_down,
Icons.trending_flat,
Icons.trending_up,
Icons.trip_origin,
Icons.tune,
Icons.turned_in,
Icons.turned_in_not,
Icons.tv,
Icons.unarchive,
Icons.undo,
Icons.unfold_less,
Icons.unfold_more,
Icons.update,
Icons.usb,
Icons.verified_user,
Icons.vertical_align_bottom,
Icons.vertical_align_center,
Icons.vertical_align_top,
Icons.vibration,
Icons.video_call,
Icons.video_label,
Icons.video_library,
Icons.videocam,
Icons.videocam_off,
Icons.videogame_asset,
Icons.view_agenda,
Icons.view_array,
Icons.view_carousel,
Icons.view_column,
Icons.view_comfy,
Icons.view_compact,
Icons.view_day,
Icons.view_headline,
Icons.view_list,
Icons.view_module,
Icons.view_quilt,
Icons.view_stream,
Icons.view_week,
Icons.vignette,
Icons.visibility,
Icons.visibility_off,
Icons.voice_chat,
Icons.voicemail,
Icons.volume_down,
Icons.volume_mute,
Icons.volume_off,
Icons.volume_up,
Icons.vpn_key,
Icons.vpn_lock,
Icons.wallpaper,
Icons.warning,
Icons.watch,
Icons.watch_later,
Icons.wb_auto,
Icons.wb_cloudy,
Icons.wb_incandescent,
Icons.wb_iridescent,
Icons.wb_sunny,
Icons.wc,
Icons.web,
Icons.web_asset,
Icons.weekend,
Icons.whatshot,
Icons.widgets,
Icons.wifi,
Icons.wifi_lock,
Icons.wifi_tethering,
Icons.work,
Icons.wrap_text,
Icons.youtube_searched_for,
Icons.zoom_in,
Icons.zoom_out,
Icons.zoom_out_map,
// END GENERATED,
];
+993
View File
@@ -0,0 +1,993 @@
final List<String> iconNameList = [
// Generated code: do not hand-edit.',
// See https://github.com/flutter/flutter/wiki/Updating-Material-Design-Fonts',
// BEGIN GENERATED',
'threesixty',
'threed_rotation',
'four_k',
'ac_unit',
'access_alarm',
'access_alarms',
'access_time',
'accessibility',
'accessibility_new',
'accessible',
'accessible_forward',
'account_balance',
'account_balance_wallet',
'account_box',
'account_circle',
'adb',
'add',
'add_a_photo',
'add_alarm',
'add_alert',
'add_box',
'add_call',
'add_circle',
'add_circle_outline',
'add_comment',
'add_location',
'add_photo_alternate',
'add_shopping_cart',
'add_to_home_screen',
'add_to_photos',
'add_to_queue',
'adjust',
'airline_seat_flat',
'airline_seat_flat_angled',
'airline_seat_individual_suite',
'airline_seat_legroom_extra',
'airline_seat_legroom_normal',
'airline_seat_legroom_reduced',
'airline_seat_recline_extra',
'airline_seat_recline_normal',
'airplanemode_active',
'airplanemode_inactive',
'airplay',
'airport_shuttle',
'alarm',
'alarm_add',
'alarm_off',
'alarm_on',
'album',
'all_inclusive',
'all_out',
'alternate_email',
'android',
'announcement',
'apps',
'archive',
'arrow_back',
'arrow_back_ios',
'arrow_downward',
'arrow_drop_down',
'arrow_drop_down_circle',
'arrow_drop_up',
'arrow_forward',
'arrow_forward_ios',
'arrow_left',
'arrow_right',
'arrow_upward',
'art_track',
'aspect_ratio',
'assessment',
'assignment',
'assignment_ind',
'assignment_late',
'assignment_return',
'assignment_returned',
'assignment_turned_in',
'assistant',
'assistant_photo',
'atm',
'attach_file',
'attach_money',
'attachment',
'audiotrack',
'autorenew',
'av_timer',
'backspace',
'backup',
'battery_alert',
'battery_charging_full',
'battery_full',
'battery_std',
'battery_unknown',
'beach_access',
'beenhere',
'block',
'bluetooth',
'bluetooth_audio',
'bluetooth_connected',
'bluetooth_disabled',
'bluetooth_searching',
'blur_circular',
'blur_linear',
'blur_off',
'blur_on',
'book',
'bookmark',
'bookmark_border',
'border_all',
'border_bottom',
'border_clear',
'border_color',
'border_horizontal',
'border_inner',
'border_left',
'border_outer',
'border_right',
'border_style',
'border_top',
'border_vertical',
'branding_watermark',
'brightness_1',
'brightness_2',
'brightness_3',
'brightness_4',
'brightness_5',
'brightness_6',
'brightness_7',
'brightness_auto',
'brightness_high',
'brightness_low',
'brightness_medium',
'broken_image',
'brush',
'bubble_chart',
'bug_report',
'build',
'burst_mode',
'business',
'business_center',
'cached',
'cake',
'calendar_today',
'calendar_view_day',
'call',
'call_end',
'call_made',
'call_merge',
'call_missed',
'call_missed_outgoing',
'call_received',
'call_split',
'call_to_action',
'camera',
'camera_alt',
'camera_enhance',
'camera_front',
'camera_rear',
'camera_roll',
'cancel',
'card_giftcard',
'card_membership',
'card_travel',
'casino',
'cast',
'cast_connected',
'category',
'center_focus_strong',
'center_focus_weak',
'change_history',
'chat',
'chat_bubble',
'chat_bubble_outline',
'check',
'check_box',
'check_box_outline_blank',
'check_circle',
'check_circle_outline',
'chevron_left',
'chevron_right',
'child_care',
'child_friendly',
'chrome_reader_mode',
'class_',
'clear',
'clear_all',
'close',
'closed_caption',
'cloud',
'cloud_circle',
'cloud_done',
'cloud_download',
'cloud_off',
'cloud_queue',
'cloud_upload',
'code',
'collections',
'collections_bookmark',
'color_lens',
'colorize',
'comment',
'compare',
'compare_arrows',
'computer',
'confirmation_number',
'contact_mail',
'contact_phone',
'contacts',
'content_copy',
'content_cut',
'content_paste',
'control_point',
'control_point_duplicate',
'copyright',
'create',
'create_new_folder',
'credit_card',
'crop',
'crop_16_9',
'crop_3_2',
'crop_5_4',
'crop_7_5',
'crop_din',
'crop_free',
'crop_landscape',
'crop_original',
'crop_portrait',
'crop_rotate',
'crop_square',
'dashboard',
'data_usage',
'date_range',
'dehaze',
'delete',
'delete_forever',
'delete_outline',
'delete_sweep',
'departure_board',
'description',
'desktop_mac',
'desktop_windows',
'details',
'developer_board',
'developer_mode',
'device_hub',
'device_unknown',
'devices',
'devices_other',
'dialer_sip',
'dialpad',
'directions',
'directions_bike',
'directions_boat',
'directions_bus',
'directions_car',
'directions_railway',
'directions_run',
'directions_subway',
'directions_transit',
'directions_walk',
'disc_full',
'dns',
'do_not_disturb',
'do_not_disturb_alt',
'do_not_disturb_off',
'do_not_disturb_on',
'dock',
'domain',
'done',
'done_all',
'done_outline',
'donut_large',
'donut_small',
'drafts',
'drag_handle',
'drive_eta',
'dvr',
'edit',
'edit_attributes',
'edit_location',
'eject',
'email',
'enhanced_encryption',
'equalizer',
'error',
'error_outline',
'euro_symbol',
'ev_station',
'event',
'event_available',
'event_busy',
'event_note',
'event_seat',
'exit_to_app',
'expand_less',
'expand_more',
'explicit',
'explore',
'exposure',
'exposure_neg_1',
'exposure_neg_2',
'exposure_plus_1',
'exposure_plus_2',
'exposure_zero',
'extension',
'face',
'fast_forward',
'fast_rewind',
'fastfood',
'favorite',
'favorite_border',
'featured_play_list',
'featured_video',
'feedback',
'fiber_dvr',
'fiber_manual_record',
'fiber_new',
'fiber_pin',
'fiber_smart_record',
'file_download',
'file_upload',
'filter',
'filter_1',
'filter_2',
'filter_3',
'filter_4',
'filter_5',
'filter_6',
'filter_7',
'filter_8',
'filter_9',
'filter_9_plus',
'filter_b_and_w',
'filter_center_focus',
'filter_drama',
'filter_frames',
'filter_hdr',
'filter_list',
'filter_none',
'filter_tilt_shift',
'filter_vintage',
'find_in_page',
'find_replace',
'fingerprint',
'first_page',
'fitness_center',
'flag',
'flare',
'flash_auto',
'flash_off',
'flash_on',
'flight',
'flight_land',
'flight_takeoff',
'flip',
'flip_to_back',
'flip_to_front',
'folder',
'folder_open',
'folder_shared',
'folder_special',
'font_download',
'format_align_center',
'format_align_justify',
'format_align_left',
'format_align_right',
'format_bold',
'format_clear',
'format_color_fill',
'format_color_reset',
'format_color_text',
'format_indent_decrease',
'format_indent_increase',
'format_italic',
'format_line_spacing',
'format_list_bulleted',
'format_list_numbered',
'format_list_numbered_rtl',
'format_paint',
'format_quote',
'format_shapes',
'format_size',
'format_strikethrough',
'format_textdirection_l_to_r',
'format_textdirection_r_to_l',
'format_underlined',
'forum',
'forward',
'forward_10',
'forward_30',
'forward_5',
'free_breakfast',
'fullscreen',
'fullscreen_exit',
'functions',
'g_translate',
'gamepad',
'games',
'gavel',
'gesture',
'get_app',
'gif',
'golf_course',
'gps_fixed',
'gps_not_fixed',
'gps_off',
'grade',
'gradient',
'grain',
'graphic_eq',
'grid_off',
'grid_on',
'group',
'group_add',
'group_work',
'hd',
'hdr_off',
'hdr_on',
'hdr_strong',
'hdr_weak',
'headset',
'headset_mic',
'headset_off',
'healing',
'hearing',
'help',
'help_outline',
'high_quality',
'highlight',
'highlight_off',
'history',
'home',
'hot_tub',
'hotel',
'hourglass_empty',
'hourglass_full',
'http',
'https',
'image',
'image_aspect_ratio',
'import_contacts',
'import_export',
'important_devices',
'inbox',
'indeterminate_check_box',
'info',
'info_outline',
'input',
'insert_chart',
'insert_comment',
'insert_drive_file',
'insert_emoticon',
'insert_invitation',
'insert_link',
'insert_photo',
'invert_colors',
'invert_colors_off',
'iso',
'keyboard',
'keyboard_arrow_down',
'keyboard_arrow_left',
'keyboard_arrow_right',
'keyboard_arrow_up',
'keyboard_backspace',
'keyboard_capslock',
'keyboard_hide',
'keyboard_return',
'keyboard_tab',
'keyboard_voice',
'kitchen',
'label',
'label_important',
'label_outline',
'landscape',
'language',
'laptop',
'laptop_chromebook',
'laptop_mac',
'laptop_windows',
'last_page',
'launch',
'layers',
'layers_clear',
'leak_add',
'leak_remove',
'lens',
'library_add',
'library_books',
'library_music',
'lightbulb_outline',
'line_style',
'line_weight',
'linear_scale',
'link',
'link_off',
'linked_camera',
'list',
'live_help',
'live_tv',
'local_activity',
'local_airport',
'local_atm',
'local_bar',
'local_cafe',
'local_car_wash',
'local_convenience_store',
'local_dining',
'local_drink',
'local_florist',
'local_gas_station',
'local_grocery_store',
'local_hospital',
'local_hotel',
'local_laundry_service',
'local_library',
'local_mall',
'local_movies',
'local_offer',
'local_parking',
'local_pharmacy',
'local_phone',
'local_pizza',
'local_play',
'local_post_office',
'local_printshop',
'local_see',
'local_shipping',
'local_taxi',
'location_city',
'location_disabled',
'location_off',
'location_on',
'location_searching',
'lock',
'lock_open',
'lock_outline',
'looks',
'looks_3',
'looks_4',
'looks_5',
'looks_6',
'looks_one',
'looks_two',
'loop',
'loupe',
'low_priority',
'loyalty',
'mail',
'mail_outline',
'map',
'markunread',
'markunread_mailbox',
'maximize',
'memory',
'menu',
'merge_type',
'message',
'mic',
'mic_none',
'mic_off',
'minimize',
'missed_video_call',
'mms',
'mobile_screen_share',
'mode_comment',
'mode_edit',
'monetization_on',
'money_off',
'monochrome_photos',
'mood',
'mood_bad',
'more',
'more_horiz',
'more_vert',
'motorcycle',
'mouse',
'move_to_inbox',
'movie',
'movie_creation',
'movie_filter',
'multiline_chart',
'music_note',
'music_video',
'my_location',
'nature',
'nature_people',
'navigate_before',
'navigate_next',
'navigation',
'near_me',
'network_cell',
'network_check',
'network_locked',
'network_wifi',
'new_releases',
'next_week',
'nfc',
'no_encryption',
'no_sim',
'not_interested',
'not_listed_location',
'note',
'note_add',
'notification_important',
'notifications',
'notifications_active',
'notifications_none',
'notifications_off',
'notifications_paused',
'offline_bolt',
'offline_pin',
'ondemand_video',
'opacity',
'open_in_browser',
'open_in_new',
'open_with',
'outlined_flag',
'pages',
'pageview',
'palette',
'pan_tool',
'panorama',
'panorama_fish_eye',
'panorama_horizontal',
'panorama_vertical',
'panorama_wide_angle',
'party_mode',
'pause',
'pause_circle_filled',
'pause_circle_outline',
'payment',
'people',
'people_outline',
'perm_camera_mic',
'perm_contact_calendar',
'perm_data_setting',
'perm_device_information',
'perm_identity',
'perm_media',
'perm_phone_msg',
'perm_scan_wifi',
'person',
'person_add',
'person_outline',
'person_pin',
'person_pin_circle',
'personal_video',
'pets',
'phone',
'phone_android',
'phone_bluetooth_speaker',
'phone_forwarded',
'phone_in_talk',
'phone_iphone',
'phone_locked',
'phone_missed',
'phone_paused',
'phonelink',
'phonelink_erase',
'phonelink_lock',
'phonelink_off',
'phonelink_ring',
'phonelink_setup',
'photo',
'photo_album',
'photo_camera',
'photo_filter',
'photo_library',
'photo_size_select_actual',
'photo_size_select_large',
'photo_size_select_small',
'picture_as_pdf',
'picture_in_picture',
'picture_in_picture_alt',
'pie_chart',
'pie_chart_outlined',
'pin_drop',
'place',
'play_arrow',
'play_circle_filled',
'play_circle_outline',
'play_for_work',
'playlist_add',
'playlist_add_check',
'playlist_play',
'plus_one',
'poll',
'polymer',
'pool',
'portable_wifi_off',
'portrait',
'power',
'power_input',
'power_settings_new',
'pregnant_woman',
'present_to_all',
'print',
'priority_high',
'public',
'publish',
'query_builder',
'question_answer',
'queue',
'queue_music',
'queue_play_next',
'radio',
'radio_button_checked',
'radio_button_unchecked',
'rate_review',
'receipt',
'recent_actors',
'record_voice_over',
'redeem',
'redo',
'refresh',
'remove',
'remove_circle',
'remove_circle_outline',
'remove_from_queue',
'remove_red_eye',
'remove_shopping_cart',
'reorder',
'repeat',
'repeat_one',
'replay',
'replay_10',
'replay_30',
'replay_5',
'reply',
'reply_all',
'report',
'report_off',
'report_problem',
'restaurant',
'restaurant_menu',
'restore',
'restore_from_trash',
'restore_page',
'ring_volume',
'room',
'room_service',
'rotate_90_degrees_ccw',
'rotate_left',
'rotate_right',
'rounded_corner',
'router',
'rowing',
'rss_feed',
'rv_hookup',
'satellite',
'save',
'save_alt',
'scanner',
'scatter_plot',
'schedule',
'school',
'score',
'screen_lock_landscape',
'screen_lock_portrait',
'screen_lock_rotation',
'screen_rotation',
'screen_share',
'sd_card',
'sd_storage',
'search',
'security',
'select_all',
'send',
'sentiment_dissatisfied',
'sentiment_neutral',
'sentiment_satisfied',
'sentiment_very_dissatisfied',
'sentiment_very_satisfied',
'settings',
'settings_applications',
'settings_backup_restore',
'settings_bluetooth',
'settings_brightness',
'settings_cell',
'settings_ethernet',
'settings_input_antenna',
'settings_input_component',
'settings_input_composite',
'settings_input_hdmi',
'settings_input_svideo',
'settings_overscan',
'settings_phone',
'settings_power',
'settings_remote',
'settings_system_daydream',
'settings_voice',
'share',
'shop',
'shop_two',
'shopping_basket',
'shopping_cart',
'short_text',
'show_chart',
'shuffle',
'shutter_speed',
'signal_cellular_4_bar',
'signal_cellular_connected_no_internet_4_bar',
'signal_cellular_no_sim',
'signal_cellular_null',
'signal_cellular_off',
'signal_wifi_4_bar',
'signal_wifi_4_bar_lock',
'signal_wifi_off',
'sim_card',
'sim_card_alert',
'skip_next',
'skip_previous',
'slideshow',
'slow_motion_video',
'smartphone',
'smoke_free',
'smoking_rooms',
'sms',
'sms_failed',
'snooze',
'sort',
'sort_by_alpha',
'spa',
'space_bar',
'speaker',
'speaker_group',
'speaker_notes',
'speaker_notes_off',
'speaker_phone',
'spellcheck',
'star',
'star_border',
'star_half',
'stars',
'stay_current_landscape',
'stay_current_portrait',
'stay_primary_landscape',
'stay_primary_portrait',
'stop',
'stop_screen_share',
'storage',
'store',
'store_mall_directory',
'straighten',
'streetview',
'strikethrough_s',
'style',
'subdirectory_arrow_left',
'subdirectory_arrow_right',
'subject',
'subscriptions',
'subtitles',
'subway',
'supervised_user_circle',
'supervisor_account',
'surround_sound',
'swap_calls',
'swap_horiz',
'swap_horizontal_circle',
'swap_vert',
'swap_vertical_circle',
'switch_camera',
'switch_video',
'sync',
'sync_disabled',
'sync_problem',
'system_update',
'system_update_alt',
'tab',
'tab_unselected',
'table_chart',
'tablet',
'tablet_android',
'tablet_mac',
'tag_faces',
'tap_and_play',
'terrain',
'text_fields',
'text_format',
'text_rotate_up',
'text_rotate_vertical',
'text_rotation_angledown',
'text_rotation_angleup',
'text_rotation_down',
'text_rotation_none',
'textsms',
'texture',
'theaters',
'thumb_down',
'thumb_up',
'thumbs_up_down',
'time_to_leave',
'timelapse',
'timeline',
'timer',
'timer_10',
'timer_3',
'timer_off',
'title',
'toc',
'today',
'toll',
'tonality',
'touch_app',
'toys',
'track_changes',
'traffic',
'train',
'tram',
'transfer_within_a_station',
'transform',
'transit_enterexit',
'translate',
'trending_down',
'trending_flat',
'trending_up',
'trip_origin',
'tune',
'turned_in',
'turned_in_not',
'tv',
'unarchive',
'undo',
'unfold_less',
'unfold_more',
'update',
'usb',
'verified_user',
'vertical_align_bottom',
'vertical_align_center',
'vertical_align_top',
'vibration',
'video_call',
'video_label',
'video_library',
'videocam',
'videocam_off',
'videogame_asset',
'view_agenda',
'view_array',
'view_carousel',
'view_column',
'view_comfy',
'view_compact',
'view_day',
'view_headline',
'view_list',
'view_module',
'view_quilt',
'view_stream',
'view_week',
'vignette',
'visibility',
'visibility_off',
'voice_chat',
'voicemail',
'volume_down',
'volume_mute',
'volume_off',
'volume_up',
'vpn_key',
'vpn_lock',
'wallpaper',
'warning',
'watch',
'watch_later',
'wb_auto',
'wb_cloudy',
'wb_incandescent',
'wb_iridescent',
'wb_sunny',
'wc',
'web',
'web_asset',
'weekend',
'whatshot',
'widgets',
'wifi',
'wifi_lock',
'wifi_tethering',
'work',
'wrap_text',
'youtube_searched_for',
'zoom_in',
'zoom_out',
'zoom_out_map',
// END GENERATED',
];
+77
View File
@@ -0,0 +1,77 @@
class Common {
factory Common() => _getInstance();
static Common get instance => _getInstance();
static Common _instance; // 单例对象
static Common _getInstance() {
if (_instance == null) {
_instance = Common._internal();
}
return _instance;
}
Common._internal();
/////////////////////////////////////////////////////////////
String sDCardDir;
String getFileSize(int fileSize) {
String str = '';
if (fileSize < 1024) {
str = '${fileSize.toStringAsFixed(2)}B';
} else if (1024 <= fileSize && fileSize < 1048576) {
str = '${(fileSize / 1024).toStringAsFixed(2)}KB';
} else if (1048576 <= fileSize && fileSize < 1073741824) {
str = '${(fileSize / 1024 / 1024).toStringAsFixed(2)}MB';
}
return str;
}
String selectIcon(String ext) {
String iconImg = 'assets/files_icons/unknown.png';
switch (ext) {
case '.ppt':
case '.pptx':
iconImg = 'assets/files_icons/ppt.png';
break;
case '.doc':
case '.docx':
iconImg = 'assets/files_icons/word.png';
break;
case '.xls':
case '.xlsx':
iconImg = 'assets/files_icons/excel.png';
break;
case '.jpg':
case '.jpeg':
case '.png':
iconImg = 'assets/files_icons/image.png';
break;
case '.txt':
iconImg = 'assets/files_icons/txt.png';
break;
case '.mp3':
iconImg = 'assets/files_icons/mp3.png';
break;
case '.mp4':
iconImg = 'assets/files_icons/video.png';
break;
case '.rar':
case '.zip':
iconImg = 'assets/files_icons/zip.png';
break;
case '.psd':
iconImg = 'assets/files_icons/psd.png';
break;
default:
iconImg = 'assets/files_icons/file.png';
break;
}
return iconImg;
}
}
+82
View File
@@ -0,0 +1,82 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'common.dart';
//import 'file_manager.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:flutter/services.dart';
import '../main.dart';
checkPermission() {
WidgetsFlutterBinding.ensureInitialized();
initializeDateFormatting("zh_CN", null).then((value) async{
bool ret = await getPermission();
if (ret) {
getSDCardDir().then((value) {
//runApp(MyApp());
runApp(MaterialApp(
//title: '启动图demo',
debugShowCheckedModeBanner: false,
theme: new ThemeData(
brightness: Brightness.light,
backgroundColor: Colors.white,
platform: TargetPlatform.android),
home: new SplashScreen(),
routes: <String, WidgetBuilder>{
'/home': (BuildContext context) => MyApp()
},
));
});
} else {
Fluttertoast.showToast(msg: '用户未授权,程序无法正常运行!', gravity: ToastGravity.CENTER);
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
}
});
}
// Permission check,适用于 permission_handler: ^5.x.x
Future<bool> getPermission() async {
if (Platform.isAndroid) {
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> permissionStatuses = await [
Permission.storage,
Permission.camera,
Permission.microphone,
].request();
if (permissionStatuses[Permission.storage] != PermissionStatus.granted ||
permissionStatuses[Permission.camera] != PermissionStatus.granted ||
permissionStatuses[Permission.microphone] != PermissionStatus.granted) {
return false;
}
} else if (Platform.isIOS) {}
return true;
}
// Permission check,适用于 permission_handler: ^3.3.0
// Future<bool> getPermission() async {
// List<PermissionGroup> permissionGroupList = [
// PermissionGroup.storage,
// PermissionGroup.camera,
// PermissionGroup.microphone,
// ];
// if (Platform.isAndroid) {
// PermissionStatus permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
// if (permission != PermissionStatus.granted) {
// await PermissionHandler().requestPermissions(permissionGroupList);
// }
// permission = await PermissionHandler().checkPermissionStatus(PermissionGroup.storage);
// if (permission != PermissionStatus.granted) {
// return false;
// }
// } else if (Platform.isIOS) {}
// return true;
// }
Future<void> getSDCardDir() async {
Common().sDCardDir = (await getExternalStorageDirectory()).path;
}
+233
View File
@@ -0,0 +1,233 @@
import 'dart:async';
import 'dart:io' show Platform;
import 'dart:ui';
import 'package:badges/badges.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bmfbase/BaiduMap/bmfmap_base.dart' show BMFMapSDK, BMF_COORD_TYPE;
import 'package:flutter_screenutil/screenutil_init.dart';
import 'package:hyzp_ybqx/pages/Login/LoginTabs2.dart';
import 'package:hyzp_ybqx/pages/MyMsics/05_updated/MyUpdatedNew.dart';
import 'package:hyzp_ybqx/pages/Works/TJXX/tj_data.dart';
import 'package:package_info/package_info.dart';
// 引入provider
import 'package:provider/provider.dart';
import 'components/commonFun.dart';
import 'file_manager/file_manager_init.dart';
// import 'provider/Cart.dart';
// import 'provider/CheckOut.dart';
import 'pages/Login/LoginTabs.dart';
import 'provider/player_ratio.dart';
import 'provider/player_region.dart';
import 'routers/router.dart';
void main() {
//file_manager_load();
//runApp(MyApp());
WidgetsFlutterBinding.ensureInitialized(); //必须要添加这个进行初始化 否则下面会错误
//Flutter 强制竖屏
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp, // 纵向,portrait 肖像
// DeviceOrientation.portraitDown, // 旋转180度
// DeviceOrientation.landscapeLeft, //顺时针旋转90度
// DeviceOrientation.landscapeRight, //逆时针旋转90度
]).then((_) {
checkPermission(); //请求用户授权
});
}
// class LoadMyApp extends StatefulWidget {
// LoadMyApp({Key key}) : super(key: key);
//
// _LoadMyAppState createState() => _LoadMyAppState();
// }
//
// class _LoadMyAppState extends State<LoadMyApp> {
// @override
// Widget build(BuildContext context) {
// return new MaterialApp(
// //title: "LoadActivity",
// home: MyApp(),
// );
// }
// }
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
initApp();
startGetStatisDataNew();
PackageInfo.fromPlatform().then((PackageInfo packageInfo) async {
String appName = packageInfo.appName;
String packageName = packageInfo.packageName;
String version = packageInfo.version;
String buildNumber = packageInfo.buildNumber;
String buildDate =
'${buildNumber.substring(0, 4)}.${buildNumber.substring(4, 6)}.${buildNumber.substring(6, 8)}';
print('appName = $appName');
print('packageName = $packageName');
print('version = $version');
print('buildNumber = $buildNumber');
print('buildDate = $buildDate');
// I/flutter (30820): appName = 宜宾黑烟抓拍
// I/flutter (30820): packageName = com.flutter.hyzp_ybqx
// I/flutter (30820): version = 1.3.1
// I/flutter (30820): buildNumber = 20210508
// I/flutter (30820): buildDate = 2021.05.08
//Fluttertoast.showToast(msg: '当前版本 v$version。暂无更新', gravity: ToastGravity.CENTER);
// Navigator.of(context).push(MaterialPageRoute(
// builder: (context) => MyUpdated(ver: version, date: buildDate, theContext: context)));
MyUpdatedNew m = await MyUpdatedNew(
ver: version, date: buildDate, theContext: context, bStartUpdated: true);
});
super.initState();
}
void initApp() async {
// await getFileName2().then((value) {
// readUrlFile2().then((value) => writeUrlFile2());
// });
getAndroidId().then((value) {
g_userInfo.thisAndroidId = value;
// 百度地图sdk初始化鉴权
if (Platform.isIOS) {
BMFMapSDK.setApiKeyAndCoordType('I022V5cRWKDn8gguTTa1gbxqPMYWU4G0', BMF_COORD_TYPE.BD09LL);
} else if (Platform.isAndroid) {
// Android 目前不支持接口设置Apikey,
// 请在主工程的Manifest文件里设置,详细配置方法请参考官网(https://lbsyun.baidu.com/)demo
BMFMapSDK.setCoordType(BMF_COORD_TYPE.BD09LL);
}
});
}
//@override
// Widget build(BuildContext context) {
// return ScreenUtilInit(
// designSize: Size(360, 690),
// allowFontScaling: false,
// builder: () => MaterialApp(
// debugShowCheckedModeBanner: false,
// title: 'Flutter_ScreenUtil',
// theme: ThemeData(
// primarySwatch: Colors.blue,
// ),
// home: HomePage(title: 'FlutterScreenUtil Demo'),
// ),
// );
// }
@override
Widget build(BuildContext context) {
//ScreenUtil.instance = ScreenUtil(width: 750, height: 1334)..init(context);
//750:1334
//默认 width : 1080px , height:1920px , allowFontScaling:false
//double width = MediaQuery.of(context).size.width;
//sizeMediaQuery = MediaQuery.of(context).size; //这样不对
print('sizeMediaQuery = $sizeWindowPhysicalSize');
//size: Size(360.0, 674.7)
//自动适应安卓手机系统分辨率,解决 S10 手机正方形变形问题
print('window.physicalSize = ${window.physicalSize}');
//window.physicalSize = Size(1080.0, 2136.0)
sizeWindowPhysicalSize = window.physicalSize;
//double _heigth = 1080 * 16 / 9;
double _heigth = 1080 * sizeWindowPhysicalSize.height / sizeWindowPhysicalSize.width;
print('_heigth = $_heigth');
return ScreenUtilInit(
designSize: Size(1080, _heigth), //安卓手机宽高尺寸,_heigth = 1080 * 16 / 9;
//designSize: Size(1080, 1920), //安卓手机宽高尺寸,_heigth = 1080 * 16 / 9;
//designSize: Size(750, 1334), //统一使用美工设计的宽高尺寸,苹果比例
//designSize: sizeWindowPhysicalSize, //自动适应安卓手机系统分辨率,解决 S10 手机正方形变形问题
allowFontScaling: false,
builder: () => MultiProvider(
providers: [
// ChangeNotifierProvider(builder: (_) => Counter()),
// ChangeNotifierProvider(builder: (_) => Cart()),
// ChangeNotifierProvider(builder: (_) => CheckOut()),
// ChangeNotifierProvider(builder: (_) => PlayerRegionProvide()),
// ChangeNotifierProvider(builder: (_) => PlayerRatioProvide()),
ChangeNotifierProvider<PlayerRegionProvide>(create: (context) => PlayerRegionProvide()),
ChangeNotifierProvider<PlayerRatioProvide>(create: (context) => PlayerRatioProvide()),
],
child: MaterialApp(
home: LoginTabs2(),
debugShowCheckedModeBanner: false,
initialRoute: '/',
onGenerateRoute: onGenerateRoute,
theme: ThemeData(
// primaryColor: Colors.yellow
primaryColor: Colors.white),
),
),
);
// return MultiProvider(
// providers: [
// // ChangeNotifierProvider(builder: (_) => Counter()),
// // ChangeNotifierProvider(builder: (_) => Cart()),
// // ChangeNotifierProvider(builder: (_) => CheckOut()),
// // ChangeNotifierProvider(builder: (_) => PlayerRegionProvide()),
// // ChangeNotifierProvider(builder: (_) => PlayerRatioProvide()),
// ChangeNotifierProvider<PlayerRegionProvide>(create: (context) => PlayerRegionProvide()),
// ChangeNotifierProvider<PlayerRatioProvide>(create: (context) => PlayerRatioProvide()),
// ],
//
// child: MaterialApp(
// home: LoginTabs(),
// debugShowCheckedModeBanner: false,
// initialRoute: '/',
// onGenerateRoute: onGenerateRoute,
// theme: ThemeData(
// // primaryColor: Colors.yellow
// primaryColor: Colors.white),
// ),
// );
}
}
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => new _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
startTime() async {
//设置启动图生效时间
var _duration = new Duration(seconds: 2);
return new Timer(_duration, navigationPage);
}
void navigationPage() {
Navigator.of(context).pushReplacementNamed('/home');
}
@override
void initState() {
super.initState();
startTime();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new Image.asset('assets/images/hyzp_yibin_launche.png'),
),
);
}
}
+53
View File
@@ -0,0 +1,53 @@
class CateModel {
List<CateItemModel> result;
CateModel({this.result});
CateModel.fromJson(Map<String, dynamic> json) {
if (json['result'] != null) {
result = new List<CateItemModel>();
json['result'].forEach((v) {
result.add(new CateItemModel.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.result != null) {
data['result'] = this.result.map((v) => v.toJson()).toList();
}
return data;
}
}
class CateItemModel {
String sId;
String title;
Object status;
String pic;
String pid;
String sort;
CateItemModel({this.sId, this.title, this.status, this.pic, this.pid, this.sort});
CateItemModel.fromJson(Map<String, dynamic> json) {
sId = json['_id'];
title = json['title'];
status = json['status'];
pic = json['pic'];
pid = json['pid'];
sort = json['sort'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['_id'] = this.sId;
data['title'] = this.title;
data['status'] = this.status;
data['pic'] = this.pic;
data['pid'] = this.pid;
data['sort'] = this.sort;
return data;
}
}
+48
View File
@@ -0,0 +1,48 @@
// FocusModel.fromJson(json);
class FocusModel {
List<FocusItemModel> result;
FocusModel({this.result});
FocusModel.fromJson(Map<String, dynamic> json) {
if (json['result'] != null) {
result = new List<FocusItemModel>();
json['result'].forEach((v) {
result.add(new FocusItemModel.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.result != null) {
data['result'] = this.result.map((v) => v.toJson()).toList();
}
return data;
}
}
class FocusItemModel {
String sId;
String title;
String status;
String pic;
String url;
FocusItemModel({this.sId, this.title, this.status, this.pic, this.url});
FocusItemModel.fromJson(Map<String, dynamic> json) {
sId = json['_id'];
title = json['title'];
status = json['status'];
pic = json['pic'];
url = json['url'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['_id'] = this.sId;
data['title'] = this.title;
data['status'] = this.status;
data['pic'] = this.pic;
data['url'] = this.url;
return data;
}
}
+133
View File
@@ -0,0 +1,133 @@
class OrderModel {
bool success;
String message;
List<Result> result;
OrderModel({this.success, this.message, this.result});
OrderModel.fromJson(Map<String, dynamic> json) {
success = json['success'];
message = json['message'];
if (json['result'] != null) {
result = new List<Result>();
json['result'].forEach((v) {
result.add(new Result.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['success'] = this.success;
data['message'] = this.message;
if (this.result != null) {
data['result'] = this.result.map((v) => v.toJson()).toList();
}
return data;
}
}
class Result {
String sId;
String uid;
String name;
String phone;
String address;
String allPrice;
int payStatus;
int orderStatus;
List<OrderItem> orderItem;
Result(
{this.sId,
this.uid,
this.name,
this.phone,
this.address,
this.allPrice,
this.payStatus,
this.orderStatus,
this.orderItem});
Result.fromJson(Map<String, dynamic> json) {
sId = json['_id'];
uid = json['uid'];
name = json['name'];
phone = json['phone'];
address = json['address'];
allPrice = json['all_price'];
payStatus = json['pay_status'];
orderStatus = json['order_status'];
if (json['order_item'] != null) {
orderItem = new List<OrderItem>();
json['order_item'].forEach((v) {
orderItem.add(new OrderItem.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['_id'] = this.sId;
data['uid'] = this.uid;
data['name'] = this.name;
data['phone'] = this.phone;
data['address'] = this.address;
data['all_price'] = this.allPrice;
data['pay_status'] = this.payStatus;
data['order_status'] = this.orderStatus;
if (this.orderItem != null) {
data['order_item'] = this.orderItem.map((v) => v.toJson()).toList();
}
return data;
}
}
class OrderItem {
String sId;
String orderId;
String productTitle;
String productId;
int productPrice;
String productImg;
int productCount;
String selectedAttr;
int addTime;
OrderItem(
{this.sId,
this.orderId,
this.productTitle,
this.productId,
this.productPrice,
this.productImg,
this.productCount,
this.selectedAttr,
this.addTime});
OrderItem.fromJson(Map<String, dynamic> json) {
sId = json['_id'];
orderId = json['order_id'];
productTitle = json['product_title'];
productId = json['product_id'];
productPrice = json['product_price'];
productImg = json['product_img'];
productCount = json['product_count'];
selectedAttr = json['selected_attr'];
addTime = json['add_time'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['_id'] = this.sId;
data['order_id'] = this.orderId;
data['product_title'] = this.productTitle;
data['product_id'] = this.productId;
data['product_price'] = this.productPrice;
data['product_img'] = this.productImg;
data['product_count'] = this.productCount;
data['selected_attr'] = this.selectedAttr;
data['add_time'] = this.addTime;
return data;
}
}
+133
View File
@@ -0,0 +1,133 @@
class ProductContentModel {
ProductContentitem result;
ProductContentModel({this.result});
ProductContentModel.fromJson(Map<String, dynamic> json) {
result =
json['result'] != null ? new ProductContentitem.fromJson(json['result']) : null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.result != null) {
data['result'] = this.result.toJson();
}
return data;
}
}
class ProductContentitem {
String sId;
String title;
String cid;
Object price; //注意
String oldPrice;
Object isBest;
Object isHot;
Object isNew;
String status;
String pic;
String content;
String cname;
List<Attr> attr;
String subTitle;
Object salecount;
//新增
int count;
String selectedAttr;
ProductContentitem(
{this.sId,
this.title,
this.cid,
this.price,
this.oldPrice,
this.isBest,
this.isHot,
this.isNew,
this.status,
this.pic,
this.content,
this.cname,
this.attr,
this.subTitle,
this.salecount,
this.count,
this.selectedAttr
});
ProductContentitem.fromJson(Map<String, dynamic> json) {
sId = json['_id'];
title = json['title'];
cid = json['cid'];
price = json['price'];
oldPrice = json['old_price'];
isBest = json['is_best'];
isHot = json['is_hot'];
isNew = json['is_new'];
status = json['status'];
pic = json['pic'];
content = json['content'];
cname = json['cname'];
if (json['attr'] != null) {
attr = new List<Attr>();
json['attr'].forEach((v) {
attr.add(new Attr.fromJson(v));
});
}
subTitle = json['sub_title'];
salecount = json['salecount'];
//新增
count=1;
selectedAttr='';
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['_id'] = this.sId;
data['title'] = this.title;
data['cid'] = this.cid;
data['price'] = this.price;
data['old_price'] = this.oldPrice;
data['is_best'] = this.isBest;
data['is_hot'] = this.isHot;
data['is_new'] = this.isNew;
data['status'] = this.status;
data['pic'] = this.pic;
data['content'] = this.content;
data['cname'] = this.cname;
if (this.attr != null) {
data['attr'] = this.attr.map((v) => v.toJson()).toList();
}
data['sub_title'] = this.subTitle;
data['salecount'] = this.salecount;
return data;
}
}
class Attr {
String cate;
List<String> list;
List<Map> attrList;
Attr({this.cate, this.list});
Attr.fromJson(Map<String, dynamic> json) {
cate = json['cate'];
list = json['list'].cast<String>();
attrList=[];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['cate'] = this.cate;
data['list'] = this.list;
return data;
}
}
+63
View File
@@ -0,0 +1,63 @@
class ProductModel {
List<ProductItemModel> result;
ProductModel({this.result});
ProductModel.fromJson(Map<String, dynamic> json) {
if (json['result'] != null) {
result = new List<ProductItemModel>();
json['result'].forEach((v) {
result.add(new ProductItemModel.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.result != null) {
data['result'] = this.result.map((v) => v.toJson()).toList();
}
return data;
}
}
class ProductItemModel {
String sId;
String title;
String cid;
Object price; //所有的类型都继承 Object
String oldPrice;
String pic;
String sPic;
ProductItemModel(
{this.sId,
this.title,
this.cid,
this.price,
this.oldPrice,
this.pic,
this.sPic});
ProductItemModel.fromJson(Map<String, dynamic> json) {
sId = json['_id'];
title = json['title'];
cid = json['cid'];
price = json['price'];
oldPrice = json['old_price'];
pic = json['pic'];
sPic = json['s_pic'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['_id'] = this.sId;
data['title'] = this.title;
data['cid'] = this.cid;
data['price'] = this.price;
data['old_price'] = this.oldPrice;
data['pic'] = this.pic;
data['s_pic'] = this.sPic;
return data;
}
}
@@ -0,0 +1,93 @@
// 此文件为插件 extended_image-0.9.0 的 Example 中的代码,路径为:
// r:\Flutter\FlutterProject9\extended_image\example\lib\common\image_picker\_image_picker_io.dart
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
//import 'package:image_picker/image_picker.dart' as picker;
import 'package:flutter/cupertino.dart';
//import 'package:flutter_candies_demo_library/flutter_candies_demo_library.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
Future<Uint8List> pickImage(BuildContext context) async {
List<AssetEntity> assets = <AssetEntity>[];
final List<AssetEntity> result = await AssetPicker.pickAssets(
context,
maxAssets: 1,
pathThumbSize: 84,
gridCount: 3,
pageSize: 300,
selectedAssets: assets,
requestType: RequestType.image,
textDelegate: DefaultAssetsPickerTextDelegate(),
);
if (result != null) {
assets = List<AssetEntity>.from(result);
return assets.first.originBytes;
}
return null;
// final File file =
// await picker.ImagePicker.pickImage(source: picker.ImageSource.gallery);
// return file.readAsBytes();
}
class ImageSaver {
static Future<String> save(String name, Uint8List fileData) async {
final AssetEntity imageEntity =
await PhotoManager.editor.saveImage(fileData);
final File file = await imageEntity.file;
return file.path;
}
}
class PickerTextDelegate implements AssetsPickerTextDelegate {
factory PickerTextDelegate() => _instance;
PickerTextDelegate._internal();
static final PickerTextDelegate _instance = PickerTextDelegate._internal();
@override
String confirm = 'OK';
@override
String cancel = 'Cancel';
@override
String edit = 'Edit';
@override
String emptyPlaceHolder = 'empty';
@override
String gifIndicator = 'GIF';
@override
String heicNotSupported = 'not support HEIC yet';
@override
String loadFailed = 'load failed';
@override
String original = 'Original';
@override
String preview = 'Preview';
@override
String select = 'Select';
@override
String unSupportedAssetType = 'not support yet';
@override
String durationIndicatorBuilder(Duration duration) {
const String separator = ':';
final String minute = duration.inMinutes.toString().padLeft(2, '0');
final String second =
((duration - Duration(minutes: duration.inMinutes)).inSeconds)
.toString()
.padLeft(2, '0');
return '$minute$separator$second';
}
}
+75
View File
@@ -0,0 +1,75 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
build/
# Android related
**/android/**/gradle-wrapper.jar
**/android/.gradle
**/android/captures/
**/android/gradlew
**/android/gradlew.bat
**/android/local.properties
**/android/**/GeneratedPluginRegistrant.java
# iOS/XCode related
**/ios/**/*.mode1v3
**/ios/**/*.mode2v3
**/ios/**/*.moved-aside
**/ios/**/*.pbxuser
**/ios/**/*.perspectivev3
**/ios/**/*sync/
**/ios/**/.sconsign.dblite
**/ios/**/.tags*
**/ios/**/.vagrant/
**/ios/**/DerivedData/
**/ios/**/Icon?
**/ios/**/Pods/
**/ios/**/.symlinks/
**/ios/**/profile
**/ios/**/xcuserdata
**/ios/.generated/
**/ios/Flutter/App.framework
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
**/ios/Flutter/flutter_export_environment.sh
**/ios/ServiceDefinitions.json
**/ios/Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!**/ios/**/default.mode1v3
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+10
View File
@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: cf37c2cd07a1d3ba296efff2dc75e19ba65e1665
channel: stable
project_type: package
+5
View File
@@ -0,0 +1,5 @@
# 1.1.5
增加效果图
+1
View File
@@ -0,0 +1 @@
TODO: Add your license here.
+36
View File
@@ -0,0 +1,36 @@
# flutter_ptcontrol
#### Description
视频云台控制,方向按钮
#### Software Architecture
Software architecture description
#### Installation
1. xxxx
2. xxxx
3. xxxx
#### Instructions
1. xxxx
2. xxxx
3. xxxx
#### Contribution
1. Fork the repository
2. Create Feat_xxx branch
3. Commit your code
4. Create Pull Request
#### Gitee Feature
1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md
2. Gitee blog [blog.gitee.com](https://blog.gitee.com)
3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore)
4. The most valuable open source project [GVP](https://gitee.com/gvp)
5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help)
6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+15
View File
@@ -0,0 +1,15 @@
# flutterptcontrol
一个flutter版的视频监控中使用的云台控制widget
<img src="./doc/Screenshot_2020-05-11-14-40-05-221_com.king.ptcontrol_example.png" alt="效果图" style="zoom: 33%;" />
This project is a starting point for a Dart
[package](https://flutter.dev/developing-packages/),
a library module containing code that can be shared easily across
multiple Flutter or Dart projects.
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

@@ -0,0 +1,37 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
# Web related
lib/generated_plugin_registrant.dart
# Exceptions to above rules.
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
+10
View File
@@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: cf37c2cd07a1d3ba296efff2dc75e19ba65e1665
channel: stable
project_type: app
+16
View File
@@ -0,0 +1,16 @@
# flutterptcontrol_example
Demonstrates how to use the iscflutterplugin plugin.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook)
For help getting started with Flutter, view our
[online documentation](https://flutter.dev/docs), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
@@ -0,0 +1,7 @@
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
@@ -0,0 +1,61 @@
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 28
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.king.ptcontrol_example"
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.king.ptcontrol_example">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
@@ -0,0 +1,32 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.king.ptcontrol_example">
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:name="io.flutter.app.FlutterApplication"
android:label="flutterptcontrol_example"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- This keeps the window background of the activity showing
until Flutter renders its first frame. It can be removed if
there is no splash screen (such as the default splash screen
defined in @style/LaunchTheme). -->
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
@@ -0,0 +1,13 @@
package com.king.ptcontrol_example;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
}
}
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
Flutter draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
</resources>
@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.king.ptcontrol_example">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
@@ -0,0 +1,36 @@
buildscript {
repositories {
google()
jcenter()
// maven { url 'https://maven.aliyun.com/repository/google' }
// maven { url 'https://maven.aliyun.com/repository/jcenter' }
// maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
allprojects {
repositories {
google()
jcenter()
// maven { url 'https://maven.aliyun.com/repository/google' }
// maven { url 'https://maven.aliyun.com/repository/jcenter' }
// maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}
@@ -0,0 +1,4 @@
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
@@ -0,0 +1,6 @@
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
@@ -0,0 +1,15 @@
include ':app'
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, path ->
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
include ":$name"
project(":$name").projectDir = pluginDirectory
}
@@ -0,0 +1,32 @@
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>8.0</string>
</dict>
</plist>
@@ -0,0 +1,2 @@
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"
@@ -0,0 +1,2 @@
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
@@ -0,0 +1,87 @@
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def parse_KV_file(file, separator='=')
file_abs_path = File.expand_path(file)
if !File.exists? file_abs_path
return [];
end
generated_key_values = {}
skip_line_start_symbols = ["#", "/"]
File.foreach(file_abs_path) do |line|
next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
plugin = line.split(pattern=separator)
if plugin.length == 2
podname = plugin[0].strip()
path = plugin[1].strip()
podpath = File.expand_path("#{path}", file_abs_path)
generated_key_values[podname] = podpath
else
puts "Invalid plugin specification: #{line}"
end
end
generated_key_values
end
target 'Runner' do
# Flutter Pod
copied_flutter_dir = File.join(__dir__, 'Flutter')
copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
# Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
# That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
# CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
unless File.exist?(generated_xcode_build_settings_path)
raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
unless File.exist?(copied_framework_path)
FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
end
unless File.exist?(copied_podspec_path)
FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
end
end
# Keep pod path relative so it can be checked into Podfile.lock.
pod 'Flutter', :path => 'Flutter'
# Plugin Pods
# Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
# referring to absolute paths on developers' machines.
system('rm -rf .symlinks')
system('mkdir -p .symlinks/plugins')
plugin_pods = parse_KV_file('../.flutter-plugins')
plugin_pods.each do |name, path|
symlink = File.join('.symlinks', 'plugins', name)
File.symlink(path, symlink)
pod name, :path => File.join(symlink, 'ios')
end
end
# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system.
install! 'cocoapods', :disable_input_output_paths => true
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
end
@@ -0,0 +1,22 @@
PODS:
- Flutter (1.0.0)
- iscflutterplugin (0.0.1):
- Flutter
DEPENDENCIES:
- Flutter (from `Flutter`)
- iscflutterplugin (from `.symlinks/plugins/iscflutterplugin/ios`)
EXTERNAL SOURCES:
Flutter:
:path: Flutter
iscflutterplugin:
:path: ".symlinks/plugins/iscflutterplugin/ios"
SPEC CHECKSUMS:
Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
iscflutterplugin: 4b821515f4f5c3391bd2bee65dc568d476c8dff4
PODFILE CHECKSUM: 3dbe063e9c90a5d7c9e4e76e70a821b9e2c1d271
COCOAPODS: 1.8.4
@@ -0,0 +1,579 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
97FAA71ED6FAB34DB8E13CD2 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F6DB52853A0D7DDB2FC6045 /* libPods-Runner.a */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
32E3F146EC25FFA8FB828ED3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
6F477566E2112BBA771ACE7B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
75EE6B503DCA7730497CCE8B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
9F6DB52853A0D7DDB2FC6045 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
97FAA71ED6FAB34DB8E13CD2 /* libPods-Runner.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
81E05D4962D2A179DAC58AEC /* Frameworks */ = {
isa = PBXGroup;
children = (
9F6DB52853A0D7DDB2FC6045 /* libPods-Runner.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B80C3931E831B6300D905FE /* App.framework */,
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEBA1CF902C7004384FC /* Flutter.framework */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
B605CE0B350A0D9ADA50C6BD /* Pods */,
81E05D4962D2A179DAC58AEC /* Frameworks */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
97C146F11CF9000F007C117D /* Supporting Files */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
);
path = Runner;
sourceTree = "<group>";
};
97C146F11CF9000F007C117D /* Supporting Files */ = {
isa = PBXGroup;
children = (
97C146F21CF9000F007C117D /* main.m */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
B605CE0B350A0D9ADA50C6BD /* Pods */ = {
isa = PBXGroup;
children = (
6F477566E2112BBA771ACE7B /* Pods-Runner.debug.xcconfig */,
32E3F146EC25FFA8FB828ED3 /* Pods-Runner.release.xcconfig */,
75EE6B503DCA7730497CCE8B /* Pods-Runner.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9A77DD0339FAD06F2EB23198 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
91131F60B9723BCC2912AD1A /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1020;
ORGANIZATIONNAME = "The Chromium Authors";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
DevelopmentTeam = A6P3VDZQ6H;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
};
91131F60B9723BCC2912AD1A /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
9A77DD0339FAD06F2EB23198 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,
97C146F31CF9000F007C117D /* main.m in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A6P3VDZQ6H;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.king.iscflutterpluginExample;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A6P3VDZQ6H;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.king.iscflutterpluginExample;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = A6P3VDZQ6H;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
PRODUCT_BUNDLE_IDENTIFIER = com.king.iscflutterpluginExample;
PRODUCT_NAME = "$(TARGET_NAME)";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
@@ -0,0 +1,6 @@
#import <Flutter/Flutter.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : FlutterAppDelegate
@end
@@ -0,0 +1,13 @@
#import "AppDelegate.h"
#import "GeneratedPluginRegistrant.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
@@ -0,0 +1,122 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -0,0 +1,23 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 B

@@ -0,0 +1,5 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>iscflutterplugin_example</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>io.flutter.embedded_views_preview</key>
<true/>
</dict>
</plist>

Some files were not shown because too many files have changed in this diff Show More