@@ -1,5 +1,6 @@ | |||||
package cn.zhios.zhiying_comm_example; | package cn.zhios.zhiying_comm_example; | ||||
import cn.zhios.zhiying_comm.ZhiyingCommPlugin; | |||||
import cn.zhios.zhiying_comm.ZhiyingFlutterCommHandler; | import cn.zhios.zhiying_comm.ZhiyingFlutterCommHandler; | ||||
import cn.zhios.zhiying_comm.ZhiyingFlutterCommNativable; | import cn.zhios.zhiying_comm.ZhiyingFlutterCommNativable; | ||||
import cn.zhios.zhiying_comm.ZhiyingFlutterCommNative; | import cn.zhios.zhiying_comm.ZhiyingFlutterCommNative; | ||||
@@ -9,18 +10,20 @@ import java.util.HashMap; | |||||
import java.util.Map; | import java.util.Map; | ||||
import androidx.annotation.NonNull; | import androidx.annotation.NonNull; | ||||
import io.flutter.embedding.android.FlutterActivity; | import io.flutter.embedding.android.FlutterActivity; | ||||
import io.flutter.embedding.engine.FlutterEngine; | import io.flutter.embedding.engine.FlutterEngine; | ||||
import io.flutter.plugins.GeneratedPluginRegistrant; | import io.flutter.plugins.GeneratedPluginRegistrant; | ||||
public class MainActivity extends FlutterActivity implements ZhiyingFlutterCommNativable { | public class MainActivity extends FlutterActivity implements ZhiyingFlutterCommNativable { | ||||
@Override | |||||
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { | |||||
GeneratedPluginRegistrant.registerWith(flutterEngine); | |||||
ZhiyingFlutterCommNative.getInstance().regist((ZhiyingFlutterCommNativable) this); | |||||
} | |||||
@Override | |||||
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { | |||||
GeneratedPluginRegistrant.registerWith(flutterEngine); | |||||
ZhiyingFlutterCommNative.getInstance().regist(this); | |||||
} | |||||
boolean localDebug = false; | |||||
boolean localDebug = false; | |||||
@Override | @Override | ||||
public void openPage(Map params) { | public void openPage(Map params) { | ||||
@@ -35,13 +38,21 @@ public class MainActivity extends FlutterActivity implements ZhiyingFlutterCommN | |||||
@Override | @Override | ||||
public Map getSetting() { | public Map getSetting() { | ||||
Map map = new HashMap(); | Map map = new HashMap(); | ||||
map.put("domain", "http://120.76.175.204:8989"); | |||||
map.put("domain", "http://192.168.0.113:5000"); //"http://120.76.175.204:8989"); | |||||
map.put("master_id", "123456"); | |||||
map.put("secret_key", "123456"); | |||||
map.put("token", "123465"); | |||||
return map; | return map; | ||||
} | } | ||||
@Override | @Override | ||||
public void invokeMethod(String method, Map<String, Object> params, ZhiyingFlutterCommHandler handler) { | public void invokeMethod(String method, Map<String, Object> params, ZhiyingFlutterCommHandler handler) { | ||||
return ; | |||||
return; | |||||
} | } | ||||
@Override | |||||
protected void onDestroy() { | |||||
super.onDestroy(); | |||||
ZhiyingFlutterCommNative.getInstance().unregist(); | |||||
} | |||||
} | } |
@@ -0,0 +1,144 @@ | |||||
import 'dart:async'; | |||||
import 'dart:io'; | |||||
import 'dart:ui'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:flutter/services.dart'; | |||||
import 'package:device_info/device_info.dart'; | |||||
class DeviceInfoPage extends StatefulWidget { | |||||
@override | |||||
_DeviceInfoPageState createState() => _DeviceInfoPageState(); | |||||
} | |||||
class _DeviceInfoPageState extends State<DeviceInfoPage> { | |||||
static final DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin(); | |||||
Map<String, dynamic> _deviceData = <String, dynamic>{}; | |||||
@override | |||||
void initState() { | |||||
super.initState(); | |||||
initPlatformState(); | |||||
} | |||||
Future<void> initPlatformState() async { | |||||
Map<String, dynamic> deviceData; | |||||
try { | |||||
if (Platform.isAndroid) { | |||||
deviceData = _readAndroidBuildData(await deviceInfoPlugin.androidInfo); | |||||
} else if (Platform.isIOS) { | |||||
deviceData = _readIosDeviceInfo(await deviceInfoPlugin.iosInfo); | |||||
} | |||||
} on PlatformException { | |||||
deviceData = <String, dynamic>{ | |||||
'Error:': 'Failed to get platform version.' | |||||
}; | |||||
} | |||||
if (!mounted) return; | |||||
setState(() { | |||||
_deviceData = deviceData; | |||||
}); | |||||
} | |||||
Map<String, dynamic> _readAndroidBuildData(AndroidDeviceInfo build) { | |||||
// 分辨率 | |||||
int width = window.physicalSize.width.floor(); | |||||
int height = window.physicalSize.height.floor(); | |||||
return <String, dynamic>{ | |||||
'version.securityPatch': build.version.securityPatch, | |||||
'version.sdkInt': build.version.sdkInt, | |||||
'version.release': build.version.release, | |||||
'version.previewSdkInt': build.version.previewSdkInt, | |||||
'version.incremental': build.version.incremental, | |||||
'version.codename': build.version.codename, | |||||
'version.baseOS': build.version.baseOS, | |||||
'board': build.board, | |||||
'bootloader': build.bootloader, | |||||
'brand': build.brand, | |||||
'device': build.device, | |||||
'display': build.display, | |||||
'fingerprint': build.fingerprint, | |||||
'hardware': build.hardware, | |||||
'host': build.host, | |||||
'id': build.id, | |||||
'manufacturer': build.manufacturer, | |||||
'model': build.model, | |||||
'product': build.product, | |||||
'supported32BitAbis': build.supported32BitAbis, | |||||
'supported64BitAbis': build.supported64BitAbis, | |||||
'supportedAbis': build.supportedAbis, | |||||
'tags': build.tags, | |||||
'type': build.type, | |||||
'isPhysicalDevice': build.isPhysicalDevice, | |||||
'androidId': build.androidId, | |||||
'systemFeatures': build.systemFeatures, | |||||
'分辨率': '${width} * ${height}', | |||||
}; | |||||
} | |||||
Map<String, dynamic> _readIosDeviceInfo(IosDeviceInfo data) { | |||||
// 分辨率 | |||||
int width = window.physicalSize.width.floor(); | |||||
int height = window.physicalSize.height.floor(); | |||||
return <String, dynamic>{ | |||||
'name': data.name, | |||||
'systemName': data.systemName, | |||||
'systemVersion': data.systemVersion, | |||||
'model': data.model, | |||||
'localizedModel': data.localizedModel, | |||||
'identifierForVendor': data.identifierForVendor, | |||||
'isPhysicalDevice': data.isPhysicalDevice, | |||||
'utsname.sysname:': data.utsname.sysname, | |||||
'utsname.nodename:': data.utsname.nodename, | |||||
'utsname.release:': data.utsname.release, | |||||
'utsname.version:': data.utsname.version, | |||||
'utsname.machine:': data.utsname.machine, | |||||
'分辨率': '${width} * ${height}', | |||||
}; | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return MaterialApp( | |||||
home: Scaffold( | |||||
appBar: AppBar( | |||||
title: Text( | |||||
Platform.isAndroid ? 'Android Device Info' : 'iOS Device Info'), | |||||
), | |||||
body: ListView( | |||||
children: _deviceData.keys.map((String property) { | |||||
return Row( | |||||
children: <Widget>[ | |||||
Container( | |||||
padding: const EdgeInsets.all(10.0), | |||||
child: Text( | |||||
property, | |||||
style: const TextStyle( | |||||
fontWeight: FontWeight.bold, | |||||
), | |||||
), | |||||
), | |||||
Expanded( | |||||
child: Container( | |||||
padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 10.0), | |||||
child: Text( | |||||
'${_deviceData[property]}', | |||||
maxLines: 10, | |||||
overflow: TextOverflow.ellipsis, | |||||
), | |||||
)), | |||||
], | |||||
); | |||||
}).toList(), | |||||
), | |||||
), | |||||
); | |||||
} | |||||
} |
@@ -0,0 +1,57 @@ | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | |||||
class LogUtil { | |||||
static void test() { | |||||
// log | |||||
Logger.log("this is log"); | |||||
// debug | |||||
Logger.debug("this is debug", "this is debug message"); | |||||
// warn | |||||
Logger.warn("this is warn", "this is a warning message"); | |||||
// error | |||||
Logger.error("this is error", "this is a error message"); | |||||
// test error | |||||
try { | |||||
final test = {}; | |||||
test["test"]["test"] = 1; | |||||
} catch (a, e) { | |||||
Logger.error(a, e); | |||||
} | |||||
// time test | |||||
Logger.time("timeTest"); | |||||
Logger.endTime("timeTest"); | |||||
// log net work | |||||
Logger.net( | |||||
"api/user/getUser", | |||||
data: {"user": "yung", "pass": "xxxxxx"}, | |||||
); | |||||
Logger.endNet( | |||||
"api/user/getUser", | |||||
data: { | |||||
"users": [ | |||||
{"id": 1, "name": "yung", "avatar": "xxx"}, | |||||
{"id": 2, "name": "yung2", "avatar": "xxx"} | |||||
] | |||||
}, | |||||
); | |||||
// log net work | |||||
Logger.net("ws/chat/getList", data: {"chanel": 1}, type: "Socket"); | |||||
Logger.endNet( | |||||
"ws/chat/getList", | |||||
data: { | |||||
"users": [ | |||||
{"id": 1, "name": "yung", "avatar": "xxx"}, | |||||
{"id": 2, "name": "yung2", "avatar": "xxx"} | |||||
] | |||||
}, | |||||
); | |||||
} | |||||
} |
@@ -1,8 +1,8 @@ | |||||
import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
import 'dart:async'; | |||||
import 'package:flutter/services.dart'; | |||||
import 'package:zhiying_comm/zhiying_comm.dart'; | import 'package:zhiying_comm/zhiying_comm.dart'; | ||||
import 'package:zhiying_comm_example/device_info_page.dart'; | |||||
import 'package:zhiying_comm_example/log_util.dart'; | |||||
import 'package:zhiying_comm_example/package_info_page.dart'; | |||||
void main() => runApp(MyApp()); | void main() => runApp(MyApp()); | ||||
@@ -21,37 +21,95 @@ class _MyAppState extends State<MyApp> { | |||||
Widget build(BuildContext context) { | Widget build(BuildContext context) { | ||||
return MaterialApp( | return MaterialApp( | ||||
home: Scaffold( | home: Scaffold( | ||||
appBar: AppBar( | |||||
title: const Text('智莺-基础库'), | |||||
), | |||||
body: Wrap( | |||||
direction: Axis.horizontal, | |||||
spacing: 5, | |||||
children: <Widget>[ | |||||
RaisedButton( | |||||
onPressed: () { | |||||
NetUtil.post('/siteapi/v1/ucenter/login/', params: { | |||||
'username': 'xiangguohui', | |||||
'password': 'fnuo123com' | |||||
}); | |||||
}, | |||||
child: Text('登录请求'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: () { | |||||
NetUtil.request('/api/v1/rec/featured?page=1', | |||||
method: NetMethod.GET, params: {}); | |||||
}, | |||||
child: Text('页面请求'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: () { | |||||
NetUtil.request('/api/v1/config.json', params: {}); | |||||
}, | |||||
child: Text('基础配置'), | |||||
) | |||||
], | |||||
)), | |||||
appBar: AppBar( | |||||
title: const Text('智莺-基础库'), | |||||
), | |||||
body: HomePage(), | |||||
), | |||||
); | |||||
} | |||||
} | |||||
class HomePage extends StatelessWidget { | |||||
netPost() async { | |||||
dynamic result = await NetUtil.post('/api/v1/rec/featured?page=1', params: null); | |||||
print("result === ${result?.toString()}"); | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return SingleChildScrollView( | |||||
child: Center( | |||||
child: Column( | |||||
crossAxisAlignment: CrossAxisAlignment.center, | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
children: <Widget>[ | |||||
RaisedButton( | |||||
onPressed: () { | |||||
Navigator.push(context, MaterialPageRoute(builder: (_) { | |||||
return DeviceInfoPage(); | |||||
})); | |||||
}, | |||||
child: Text('设备信息'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: () { | |||||
Navigator.push(context, MaterialPageRoute(builder: (_) { | |||||
return PackageInfoPage(); | |||||
})); | |||||
}, | |||||
child: Text('应用信息'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: () { | |||||
NetUtil.post('/siteapi/v1/ucenter/login/', params: { | |||||
'username': 'xiangguohui', | |||||
'password': 'fnuo123com' | |||||
}); | |||||
}, | |||||
child: Text('登录请求'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: () { | |||||
NetUtil.request('/api/v1/rec/featured?page=1', params: null, | |||||
onError: (msg) { | |||||
print('onERROR = ${msg?.toString() ?? 'onError'}'); | |||||
}, onSuccess: (json) { | |||||
print('onSuccess = ${json?.toString() ?? 'onSuccess'}'); | |||||
}, onCache: (json) { | |||||
print('onCache = ${json?.toString() ?? 'onCache'}'); | |||||
}); | |||||
}, | |||||
child: Text('网络异步请求(带缓存)'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: () { | |||||
netPost(); | |||||
}, | |||||
child: Text('网络同步请求(无缓存)'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: (){ | |||||
LogUtil.test(); | |||||
}, | |||||
child: Text('显示日志'), | |||||
), | |||||
RaisedButton( | |||||
onPressed: (){ | |||||
Navigator.push(context, MaterialPageRoute( | |||||
builder: (_){ | |||||
return Logger(); | |||||
} | |||||
)); | |||||
}, | |||||
child: Text('打开日志视图'), | |||||
), | |||||
], | |||||
), | |||||
), | |||||
); | ); | ||||
} | } | ||||
} | } |
@@ -0,0 +1,77 @@ | |||||
// Copyright 2017 The Chromium Authors. All rights reserved. | |||||
// Use of this source code is governed by a BSD-style license that can be | |||||
// found in the LICENSE file. | |||||
// ignore_for_file: public_member_api_docs | |||||
import 'dart:async'; | |||||
import 'package:flutter/material.dart'; | |||||
import 'package:package_info/package_info.dart'; | |||||
class PackageInfoPage extends StatelessWidget { | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return MaterialApp( | |||||
title: 'PackageInfo Demo', | |||||
theme: ThemeData(primarySwatch: Colors.blue), | |||||
home: MyHomePage(title: 'PackageInfo example app'), | |||||
); | |||||
} | |||||
} | |||||
class MyHomePage extends StatefulWidget { | |||||
MyHomePage({Key key, this.title}) : super(key: key); | |||||
final String title; | |||||
@override | |||||
_MyHomePageState createState() => _MyHomePageState(); | |||||
} | |||||
class _MyHomePageState extends State<MyHomePage> { | |||||
PackageInfo _packageInfo = PackageInfo( | |||||
appName: 'Unknown', | |||||
packageName: 'Unknown', | |||||
version: 'Unknown', | |||||
buildNumber: 'Unknown', | |||||
); | |||||
@override | |||||
void initState() { | |||||
super.initState(); | |||||
_initPackageInfo(); | |||||
} | |||||
Future<void> _initPackageInfo() async { | |||||
final PackageInfo info = await PackageInfo.fromPlatform(); | |||||
setState(() { | |||||
_packageInfo = info; | |||||
}); | |||||
} | |||||
Widget _infoTile(String title, String subtitle) { | |||||
return ListTile( | |||||
title: Text(title), | |||||
subtitle: Text(subtitle ?? 'Not set'), | |||||
); | |||||
} | |||||
@override | |||||
Widget build(BuildContext context) { | |||||
return Scaffold( | |||||
appBar: AppBar( | |||||
title: Text(widget.title), | |||||
), | |||||
body: Column( | |||||
mainAxisAlignment: MainAxisAlignment.center, | |||||
children: <Widget>[ | |||||
_infoTile('App name', _packageInfo.appName), | |||||
_infoTile('Package name', _packageInfo.packageName), | |||||
_infoTile('App version', _packageInfo.version), | |||||
_infoTile('Build number', _packageInfo.buildNumber), | |||||
], | |||||
), | |||||
); | |||||
} | |||||
} |
@@ -4,5 +4,5 @@ class GlobalConfig { | |||||
static final String HTTP_RESPONSE_KEY_MSG = 'msg'; | static final String HTTP_RESPONSE_KEY_MSG = 'msg'; | ||||
static final String HTTP_RESPONSE_KEY_DATA = 'data'; | static final String HTTP_RESPONSE_KEY_DATA = 'data'; | ||||
/// 成功返回的CODE值 | /// 成功返回的CODE值 | ||||
static final int RESPONSE_SUCCESS_CODE = 200; | |||||
static final int RESPONSE_SUCCESS_CODE = 1; | |||||
} | } |
@@ -132,7 +132,7 @@ class Logger extends StatelessWidget { | |||||
/// Recording network information | /// Recording network information | ||||
static void net(String api, | static void net(String api, | ||||
{String type = "请求接口", int status = 100, Object data}) { | |||||
{String type = "接口", int status = 100, Object data}) { | |||||
assert(api != null); | assert(api != null); | ||||
if (enabled) _Net.request(api, type, status, data); | if (enabled) _Net.request(api, type, status, data); | ||||
} | } | ||||
@@ -153,39 +153,41 @@ class NetUtil { | |||||
Response response; | Response response; | ||||
try { | try { | ||||
Dio dio = await NetUtil.getInstance().dio; | Dio dio = await NetUtil.getInstance().dio; | ||||
dio.request(path, | |||||
data: sign, options: Options(method: enumToString(method))); | |||||
response = await dio.request(path, data: sign, options: Options(method: enumToString(method))); | |||||
} on DioError catch (e) { | } on DioError catch (e) { | ||||
_formatError(e); | _formatError(e); | ||||
} | } | ||||
if (response == null) { | |||||
return null; | |||||
} | |||||
try{ | |||||
var result = response.data is Map ? response.data : jsonDecode(response.data); | |||||
// TODO 解密? | |||||
if (result[GlobalConfig.HTTP_RESPONSE_KEY_CODE] == | |||||
GlobalConfig.RESPONSE_SUCCESS_CODE || | |||||
result[GlobalConfig.HTTP_RESPONSE_KEY_CODE] == | |||||
'${GlobalConfig.RESPONSE_SUCCESS_CODE}') { | |||||
if (onSuccess != null) { | |||||
onSuccess(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); | |||||
// 缓存返回的数据 | |||||
_setCallBackCacheData(cacheKey, response.data is Map ? jsonEncode(response.data) : response.data); | |||||
} | |||||
return; | |||||
} | |||||
var result = jsonDecode(response.data); | |||||
//TODO 加密? | |||||
if (result[GlobalConfig.HTTP_RESPONSE_KEY_CODE] == | |||||
GlobalConfig.RESPONSE_SUCCESS_CODE || | |||||
result[GlobalConfig.HTTP_RESPONSE_KEY_CODE] == | |||||
'${GlobalConfig.RESPONSE_SUCCESS_CODE}') { | |||||
if (onSuccess != null) { | |||||
onSuccess(result[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); | |||||
// 缓存返回的数据 | |||||
_setCallBackCacheData(cacheKey, response.data); | |||||
Logger.error('error: ' + result[GlobalConfig.HTTP_RESPONSE_KEY_MSG]); | |||||
Fluttertoast.showToast( | |||||
msg: result[GlobalConfig.HTTP_RESPONSE_KEY_MSG], | |||||
toastLength: Toast.LENGTH_SHORT, | |||||
gravity: ToastGravity.BOTTOM, | |||||
); | |||||
if (onError != null) { | |||||
onError(result[GlobalConfig.HTTP_RESPONSE_KEY_MSG] ?? '未知错误'); | |||||
} | |||||
}catch (e){ | |||||
if (onError != null) { | |||||
onError(e?.toString() ?? '未知错误'); | |||||
} | } | ||||
return; | |||||
} | } | ||||
Logger.error('error: ' + result[GlobalConfig.HTTP_RESPONSE_KEY_MSG]); | |||||
Fluttertoast.showToast( | |||||
msg: result[GlobalConfig.HTTP_RESPONSE_KEY_MSG], | |||||
toastLength: Toast.LENGTH_SHORT, | |||||
gravity: ToastGravity.BOTTOM, | |||||
); | |||||
if (onError != null) { | |||||
onError(result[GlobalConfig.HTTP_RESPONSE_KEY_MSG] ?? '未知错误'); | |||||
} | |||||
return; | return; | ||||
} | } | ||||
@@ -273,14 +275,13 @@ class NetUtil { | |||||
// 读取缓存 | // 读取缓存 | ||||
Map<String, dynamic> cacheMap = | Map<String, dynamic> cacheMap = | ||||
await SharedPreferencesUtil.getNetCacheResult(cacheKey); | await SharedPreferencesUtil.getNetCacheResult(cacheKey); | ||||
if (!EmptyUtil.isEmpty(cacheMap) && | if (!EmptyUtil.isEmpty(cacheMap) && | ||||
cacheMap.containsKey(GlobalConfig.RESPONSE_SUCCESS_CODE) && | |||||
(cacheMap[GlobalConfig.RESPONSE_SUCCESS_CODE] == | |||||
GlobalConfig.RESPONSE_SUCCESS_CODE || | |||||
cacheMap[GlobalConfig.RESPONSE_SUCCESS_CODE] == | |||||
'${GlobalConfig.RESPONSE_SUCCESS_CODE}') && | |||||
cacheMap.containsKey(GlobalConfig.HTTP_RESPONSE_KEY_CODE) && | |||||
(cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] == GlobalConfig.RESPONSE_SUCCESS_CODE || | |||||
cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_CODE] == '${GlobalConfig.RESPONSE_SUCCESS_CODE}') && | |||||
null != cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA]) { | null != cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA]) { | ||||
onCache(cacheMap['data']); | |||||
onCache(cacheMap[GlobalConfig.HTTP_RESPONSE_KEY_DATA]); | |||||
return; | return; | ||||
} | } | ||||
return; | return; | ||||
@@ -341,14 +342,14 @@ class NetUtil { | |||||
class _NetInterceptors extends InterceptorsWrapper { | class _NetInterceptors extends InterceptorsWrapper { | ||||
@override | @override | ||||
Future onRequest(RequestOptions options) { | Future onRequest(RequestOptions options) { | ||||
Logger.net(options?.path, data: options.data.toString()); | |||||
Logger.net(options?.uri?.toString(), data: options.data.toString()); | |||||
// TODO 加密? | // TODO 加密? | ||||
return super.onRequest(options); | return super.onRequest(options); | ||||
} | } | ||||
@override | @override | ||||
Future onResponse(Response response) { | Future onResponse(Response response) { | ||||
Logger.endNet(response?.statusCode?.toString(), | |||||
Logger.endNet(response?.request?.uri?.toString(), | |||||
data: response?.data?.toString() ?? ''); | data: response?.data?.toString() ?? ''); | ||||
// TODO 解密? | // TODO 解密? | ||||
return super.onResponse(response); | return super.onResponse(response); | ||||