Commit 035ceca6 authored by 艾娇平's avatar 艾娇平

Merge branch 'ajp/Alpha1.4.0' into dev

parents 840d60bd 7b53a2b4
import 'package:flutter/material.dart';
import 'package:hybrid_stack_manager/hybrid_stack_manager_plugin.dart';
import 'hybrid_stack/hybrid_stack_manager_plugin.dart';
import 'opinion.dart';
......
import 'dart:async';
import 'package:flutter/services.dart';
import '../services/ALNetClient.dart';
import 'dart:convert';
import 'dart:typed_data';
typedef Future<dynamic> MethodHandler(MethodCall call);
class HybridStackManagerPlugin {
static HybridStackManagerPlugin hybridStackManagerPlugin =
new HybridStackManagerPlugin._internal();
MethodChannel _channel;
MethodHandler _handler;
void setMethodCallHandler(MethodHandler hdler) {
_handler = hdler;
_channel.setMethodCallHandler(_handler);
}
HybridStackManagerPlugin._internal() {
_channel = new MethodChannel('hybrid_stack_manager');
}
openUrlFromNative({String url, Map query, Map params, bool animated}) {
_channel.invokeMethod("openUrlFromNative", {
"url": url ?? "",
"query": (query ?? {}),
"params": (params ?? {}),
"animated": animated ?? true
});
}
popCurPage({bool animated = true}) {
_channel.invokeMethod("popCurPage", animated);
}
updateCurFlutterRoute(String curRouteName) {
_channel.invokeMethod("updateCurFlutterRoute", curRouteName ?? "");
}
Future<Map> getMainEntryParams() async {
dynamic info = await _channel.invokeMethod('getMainEntryParams');
return new Future.sync(() => info as Map);
}
// method 0: GET 1:POST
// Native 网络请求
Future<Map> callNativeNetWorking({String url, HttpMethod method,Map parameters}) async {
dynamic info = await _channel.invokeMethod('callNativeNetWorking', {
"url": url ?? "",
"method": 1 ?? 0,
"parameters": (parameters ?? {}),
});
return new Future.sync(() => info as Map);
}
// Native 网络加载视图
callNativeLoading({bool show = true, String message=''}) {
_channel.invokeMethod("callNativeLoading", {
'show':show,
'message':message
});
}
}
export 'hybrid_stack_manager.dart';
export 'router_option.dart';
export 'router.dart';
//import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'router_option.dart';
import 'hybrid_stack_manager.dart';
import 'utils.dart';
//import 'dart:io';
//import 'package:image/image.dart' as image;
//import 'dart:math';
typedef Widget FlutterWidgetHandler({RouterOption routeOption, Key key});
class XMaterialPageRoute<T> extends MaterialPageRoute<T> {
final WidgetBuilder builder;
final bool animated;
final GlobalKey boundaryKey;
Duration get transitionDuration {
if (animated == true) return const Duration(milliseconds: 300);
return const Duration(milliseconds: 0);
}
XMaterialPageRoute({
this.builder,
this.animated,
this.boundaryKey,
RouteSettings settings: const RouteSettings(),
}) : super(builder: builder, settings: settings);
}
class Router extends Object {
static final Router singleton = new Router._internal();
List<XMaterialPageRoute> flutterRootPageNameLst = new List();
String currentPageUrl = null;
FlutterWidgetHandler routerWidgetHandler;
GlobalKey globalKeyForRouter;
static Router sharedInstance() {
return singleton;
}
Router._internal(){
setupMethodChannel();
}
void setupMethodChannel(){
HybridStackManagerPlugin.hybridStackManagerPlugin
.setMethodCallHandler((MethodCall methodCall)async{
String method = methodCall.method;
if (method == "openURLFromFlutter") {
Map args = methodCall.arguments;
if (args != null) {
bool animated = (args["animated"] == 1);
Router.sharedInstance().pushPageWithOptionsFromFlutter(
routeOption: new RouterOption(
url: args["url"],
query: args["query"],
params: args["params"]),
animated: animated ?? false);
}
} else if (method == "popToRoot") {
Router.sharedInstance().popToRoot();
} else if (method == "popToRouteNamed") {
Router.sharedInstance().popToRouteNamed(methodCall.arguments);
} else if (method == "popRouteNamed") {
Router.sharedInstance().popRouteNamed(methodCall.arguments);
}
});
}
popToRoot() {
NavigatorState navState = Navigator.of(globalKeyForRouter.currentContext);
List<Route<dynamic>> navHistory = navState.history;
int histLen = navHistory.length;
for (int i = histLen - 1; i >= 1; i--) {
Route route = navHistory.elementAt(i);
navState.removeRoute(route);
}
}
popToRouteNamed(String routeName) {
NavigatorState navState = Navigator.of(globalKeyForRouter.currentContext);
List<Route<dynamic>> navHistory = navState.history;
int histLen = navHistory.length;
for (int i = histLen - 1; i >= 1; i--) {
Route route = navHistory.elementAt(i);
if (!(route is XMaterialPageRoute) ||
((route as XMaterialPageRoute).settings.name != routeName)) {
navState.removeRoute(route);
}
if ((route is XMaterialPageRoute) &&
((route as XMaterialPageRoute).settings.name == routeName)) break;
}
}
popRouteNamed(String routeName) {
NavigatorState navState = Navigator.of(globalKeyForRouter.currentContext);
List<Route<dynamic>> navHistory = navState.history;
int histLen = navHistory.length;
for (int i = histLen - 1; i >= 1; i--) {
Route route = navHistory.elementAt(i);
if ((route is XMaterialPageRoute) &&
((route as XMaterialPageRoute).settings.name == routeName)) {
navState.removeRoute(route);
break;
}
}
}
pushPageWithOptionsFromFlutter({RouterOption routeOption, bool animated}) {
Widget page =
Router.sharedInstance().pageFromOption(routeOption: routeOption);
if (page != null) {
GlobalKey boundaryKey = new GlobalKey();
XMaterialPageRoute pageRoute = new XMaterialPageRoute(
settings: new RouteSettings(name: routeOption.userInfo),
animated: animated,
boundaryKey: boundaryKey,
builder: (BuildContext context) {
return new RepaintBoundary(key:boundaryKey,child: page);
});
Navigator.of(globalKeyForRouter.currentContext).push(pageRoute);
HybridStackManagerPlugin.hybridStackManagerPlugin
.updateCurFlutterRoute(routeOption.userInfo);
} else {
HybridStackManagerPlugin.hybridStackManagerPlugin.openUrlFromNative(
url: routeOption.url,
query: routeOption.query,
params: routeOption.params);
}
NavigatorState navState = Navigator.of(globalKeyForRouter.currentContext);
List<Route<dynamic>> navHistory = navState.history;
}
pushPageWithOptionsFromNative({RouterOption routeOption, bool animated}) {
HybridStackManagerPlugin.hybridStackManagerPlugin.openUrlFromNative(
url: routeOption.url,
query: routeOption.query,
params: routeOption.params,
animated: animated);
}
pageFromOption({RouterOption routeOption, Key key}) {
try {
currentPageUrl = routeOption.url + "?" + converUrl(routeOption.query);
} catch (e) {}
routeOption.userInfo = Utils.generateUniquePageName(routeOption.url);
if (routerWidgetHandler != null)
return routerWidgetHandler(routeOption: routeOption, key: key);
}
static String converUrl(Map query) {
String tmpUrl = "";
if (query != null) {
bool skipfirst = true;
query.forEach((key, value) {
if (skipfirst) {
skipfirst = false;
} else {
tmpUrl = tmpUrl + "&";
}
tmpUrl = tmpUrl + (key + "=" + value.toString());
});
}
return Uri.encodeFull(tmpUrl);
}
}
class RouterOption {
String url;
Map query;
Map params;
String userInfo;
RouterOption({this.url, this.query, this.params});
}
import 'dart:async';
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;
import 'package:flutter/rendering.dart';
//import 'package:image/image.dart';
class Utils extends Object {
static int baseId = 100;
static String pageNameSeperatorToken = "_";
static int generatePrimaryPageId() {
return baseId++;
}
static Map parseUniquePageName(String pageName) {
List components = pageName.split(pageNameSeperatorToken);
if (components.length != 2) return null;
return {"name": components[0], "id": components[1]};
}
static String generateUniquePageName(String pageName) {
return (pageName ?? "") +
pageNameSeperatorToken +
generatePrimaryPageId().toString();
}
//
// static Future<Image> getImage(RenderRepaintBoundary object) async {
// ui.Image capture = await object.toImage(pixelRatio: 2.0);
// ByteData data = await capture.toByteData();
// return new Image.fromBytes(capture.width, capture.height, data.buffer.asUint32List());
// }
//
// static Future<File> writeFile(Image outputImage,String fileName) async {
// final Directory directory = await getTemporaryDirectory();
// final File outputFile = new File(path.join(directory.path, fileName));
// List<int> output = encodePng(outputImage);
// return outputFile.writeAsBytes(output);
// }
}
import 'package:flutter/material.dart';
import 'package:hybrid_stack_manager/router.dart';
import 'package:hybrid_stack_manager/hybrid_stack_manager.dart';
import 'package:hybrid_stack_manager/router_option.dart';
import 'hybrid_stack/hybrid_stack_manager_plugin.dart';
import 'app_config.dart';
import 'my_app.dart';
......@@ -13,10 +11,10 @@ import 'my_app.dart';
void main() async {
AppConfig.sharedInstance();
HybridStackManagerPlugin plugin =
HybridStackManagerPlugin.hybridStackManagerPlugin;
Map args = await plugin.getMainEntryParams();
// HybridStackManagerPlugin plugin =
// HybridStackManagerPlugin.hybridStackManagerPlugin;
runApp(new MyApp());
Map args = await HybridStackManagerPlugin.hybridStackManagerPlugin.getMainEntryParams();
if (args != null && args["url"] != null) {
RouterOption routeOption = new RouterOption(
url: args["url"], query: args["query"], params: args["params"]);
......
......@@ -9,37 +9,34 @@
import 'package:flutter/material.dart';
import 'macros/ALColors.dart';
import 'macros/ALDevice.dart';
import 'macros/ALCommon.dart';
import 'package:hybrid_stack_manager/hybrid_stack_manager_plugin.dart';
import 'services/ALNetClient.dart';
import 'hybrid_stack/hybrid_stack_manager_plugin.dart';
class Opinion extends StatelessWidget {
RouterOption routeOption;
Opinion(RouterOption option, {Key key}) : super(key: key) {
routeOption = option;
}
Widget build(BuildContext context) {
// Map m = Utils.parseUniquePageName(routeOption.userInfo);
return MaterialApp(
debugShowCheckedModeBanner: false,
title: '意见与建议',
color: ALColors.Color323232,
theme: ThemeData(
splashColor: Colors.white10
,//水波纹的颜色
splashColor: Colors.white10, //水波纹的颜色
),
home: OpinionPage(title: '意见和建议'),
home: OpinionPage(title: '意见和建议',userId: routeOption.params['user_id'].toString(),),
);
}
}
class OpinionPage extends StatefulWidget {
OpinionPage({Key key, this.title}) : super(key: key);
OpinionPage({Key key, this.title,this.userId,this.content,this.tel}) : super(key: key);
final String title;
final String userId;
final String content;
final String tel;
@override
_OpinionPageState createState() => _OpinionPageState();
}
......@@ -60,7 +57,13 @@ class _OpinionPageState extends State<OpinionPage> {
onTap: () {
HybridStackManagerPlugin.hybridStackManagerPlugin.popCurPage();
}),
title: new Text("意见与建议",style: TextStyle(color: ALColors.Color323232,fontSize: 16,fontWeight: FontWeight.bold),),
title: new Text(
"意见与建议",
style: TextStyle(
color: ALColors.Color323232,
fontSize: 16,
fontWeight: FontWeight.bold),
),
),
body: Container(
height: ALDevice.height,
......@@ -96,7 +99,7 @@ class _OpinionPageState extends State<OpinionPage> {
),
Container(
height: 40,
margin: EdgeInsets.only(left: 30, right: 30,top: 30),
margin: EdgeInsets.only(left: 30, right: 30, top: 30),
padding: EdgeInsets.only(bottom: 10),
decoration: BoxDecoration(
border: Border(
......@@ -141,13 +144,23 @@ class _OpinionPageState extends State<OpinionPage> {
),
));
}
}
void confirmClick() {
confimSuggestInfo();
print('confirmClick');
}
void confirmClick() {
void confimSuggestInfo() {
// 提交信息 && 回到上一级页面
HybridStackManagerPlugin.hybridStackManagerPlugin.popCurPage();
HybridStackManagerPlugin.hybridStackManagerPlugin.callNativeLoading();
Map<String, String> parameters = {'phone': 'dsdsdsd','content':'我是一个建议Flutter提交的','user_id':widget.userId};
HybridStackManagerPlugin.hybridStackManagerPlugin.callNativeNetWorking(
url: ALServers.API_ACCOUNT_SUGGESTION,
method: HttpMethod.HTTPMethodPOTS,
parameters: parameters).then((val){
HybridStackManagerPlugin.hybridStackManagerPlugin.callNativeLoading(message: '提交成功');
});
}
print('confirmClick');
}
......@@ -12,7 +12,9 @@ import 'ALServers.dart';
import 'package:dio/dio.dart';
import 'dart:io';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:device_info/device_info.dart';
export 'ALServers.dart';
class ALResponse {
const ALResponse(
......@@ -46,6 +48,8 @@ class ALResponse {
// 通用参数
String urlCommonParameters() {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
return 'platform=iPhone&os_version=12.1.2&version=1.3.0&model=iPhone%20XS%20Max&release=0&idfa=EE10F836-B882-4AB8-9AB1-8E116BD48DEE&idfv=178AB378-66BF-46B3-BD12-C10FAA35C74C&device_id=EE10F836-B882-4AB8-9AB1-8E116BD48DEE&channel=(null)&app_name=gengmeiios&current_city_id=worldwide&lat=0&lng=0&is_WiFi=(null)&phone_id=iPhone11,6&count=10&page=1&type=1';
}
......@@ -58,7 +62,6 @@ String fullAPI(api) {
Options requestOptions(type) {
Options options = new Options(
baseUrl: '',
contentType: new ContentType('application', 'x-www-form-urlencoded',charset: 'utf-8'),
headers: {'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 10_10_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411 GMAlpha/1.2.1'},
connectTimeout: ALServers.ConnetTimeOut,
......
......@@ -8,6 +8,11 @@
import '../macros/ALDevice.dart';
enum HttpMethod {
HTTPMethodGET, // 0
HTTPMethodPOTS // 1
}
// API
class ALServers {
ALServers._();
......@@ -22,7 +27,7 @@ class ALServers {
static const String API_ACCOUNT_REGISTER = '/api/account/register';// 用户注册
static const String API_ACCOUNT_GETVFC = '/api/account/get_vfc';// 获取验证码
static const String API_ACCOUNT_THIRDPART = '/api/account/thirdparty_login'; // 三方账户登录
static const String API_ACCOUNT_SUGGESTION = "/api/v1/suggestion"; // 意见与建议
// HOST
}
......
# Generated by pub
# See https://www.dartlang.org/tools/pub/glossary#lockfile
packages:
archive:
dependency: transitive
description:
name: archive
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.8"
args:
dependency: transitive
description:
name: args
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.5.1"
async:
dependency: transitive
description:
......@@ -43,13 +29,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.14.11"
convert:
dependency: transitive
description:
name: convert
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
cookie_jar:
dependency: transitive
description:
......@@ -57,13 +36,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.0.0"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.6"
cupertino_icons:
dependency: "direct main"
description:
......@@ -71,6 +43,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.2"
device_info:
dependency: "direct main"
description:
name: device_info
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.0+1"
dio:
dependency: "direct main"
description:
......@@ -88,20 +67,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
hybrid_stack_manager:
dependency: "direct main"
description:
name: hybrid_stack_manager
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.1.1"
image:
dependency: transitive
description:
name: image
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.7"
json_annotation:
dependency: "direct main"
description:
......@@ -131,19 +96,12 @@ packages:
source: hosted
version: "1.6.2"
path_provider:
dependency: transitive
dependency: "direct main"
description:
name: path_provider
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.4.1"
petitparser:
dependency: transitive
description:
name: petitparser
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.1"
version: "0.5.0+1"
quiver:
dependency: transitive
description:
......@@ -219,13 +177,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.8"
xml:
dependency: transitive
description:
name: xml
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.3.1"
sdks:
dart: ">=2.0.0 <3.0.0"
flutter: ">=0.3.1 <2.0.0"
flutter: ">=0.1.4 <2.0.0"
......@@ -20,15 +20,15 @@ dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^0.1.2
hybrid_stack_manager: 0.1.1
json_annotation: ^2.0.0
# 网络
dio: ^2.0.0
# 数据存储
shared_preferences: ^0.4.2
device_info: ^0.4.0
path_provider: ^0.5.0
dev_dependencies:
flutter_test:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment