Commit 9d4f000cb75e146cb7400c2937a7e9bb04e9ae2a

Authored by wdn127929
2 parents b68e1797 e90c7662

冲突

... ... @@ -33,6 +33,8 @@
android:windowSoftInputMode="adjustResize"
android:exported="true"
>
<meta-data
android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
android:value="true" />
... ... @@ -65,6 +67,40 @@
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<!-- <provider
android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
android:authorities="${applicationId}.flutter_downloader.provider"
android:exported="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="true"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
<provider
android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"
android:authorities="${applicationId}.flutter-downloader-init"
android:exported="true">
<meta-data
android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"
android:value="5" />
</provider> -->
<!-- End FlutterDownloader customization -->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="dbced781d0acd36184d5b4b54da7188d"/>
... ...
... ... @@ -8,7 +8,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath 'com.android.tools.build:gradle:3.5.4'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.huawei.agconnect:agcp:1.0.0.300'
}
... ...
#Mon Dec 20 13:10:07 CST 2021
# <<<<<<< HEAD
# #Mon Dec 20 13:10:07 CST 2021
# distributionBase=GRADLE_USER_HOME
# distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip
# =======
#Thu Dec 23 01:26:57 CST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
... ...
... ... @@ -483,7 +483,7 @@
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 310;
CURRENT_PROJECT_VERSION = 317;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
... ... @@ -628,7 +628,7 @@
CODE_SIGN_ENTITLEMENTS = "Runner/一键订Debug.entitlements";
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 310;
CURRENT_PROJECT_VERSION = 317;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
... ... @@ -663,7 +663,7 @@
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 310;
CURRENT_PROJECT_VERSION = 317;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
... ...
... ... @@ -13,6 +13,7 @@ import 'package:flutter_screenutil/screenutil.dart';
import 'package:fluwx/fluwx.dart';
import 'package:one_key/pages/detail/handle_online_page.dart';
import 'package:one_key/pages/home/home_page.dart';
import 'package:one_key/pages/login/first_page.dart';
import 'package:one_key/provider/base_info_provider.dart';
import 'package:one_key/provider/coupon_provider.dart';
import 'package:one_key/provider/create_store_model.dart';
... ... @@ -71,6 +72,7 @@ Future<void> main() async {
await initializeDateFormatting();
// _requestPermissions();
Utils.changeStatusColor();
await App.initSp();
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp, DeviceOrientation.portraitDown])
... ... @@ -133,14 +135,14 @@ class MyApp extends StatefulWidget {
class MyAppState extends State<MyApp> {
int xgCount = 1; //注册信鸽次数,最多5次
bool isLogin = false;
bool isFirst = true;
@override
void initState() {
// TODO: implement initState
super.initState();
initDio();
_initFluwx();
_isLogin();
_isFirst();
Utils.changeStatusColor();
// 设置EasyRefresh的默认样式
EasyRefresh.defaultHeader = MaterialHeader();
... ... @@ -173,6 +175,14 @@ class MyAppState extends State<MyApp> {
DioUtil().setConfig(config);
}
//第一次打开应用
bool _isFirst() {
isFirst = App.sp.getBool("isFirst") ?? true;
if (!isFirst) {
_isLogin();
}
}
//判断是否登录
bool _isLogin() {
UserModel userModel = Provider.of<UserModel>(context, listen: false);
... ... @@ -194,10 +204,12 @@ class MyAppState extends State<MyApp> {
textTheme:
TextTheme(overline: TextStyle(decoration: TextDecoration.none)),
tooltipTheme: TooltipThemeData(verticalOffset: -100000)),
home: isLogin
? HomePage(initialIndex: 1)
: ChangeNotifierProvider<OtherLoginProvider>(
create: (_) => OtherLoginProvider(), child: LoginPage()),
home: isFirst
? FirstPage()
: isLogin
? HomePage(initialIndex: 1)
: ChangeNotifierProvider<OtherLoginProvider>(
create: (_) => OtherLoginProvider(), child: LoginPage()),
onGenerateRoute: App.router.generator,
);
}
... ...
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/app.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/v_empty_view.dart';
class FirstPage extends StatefulWidget {
FirstPage({Key key}) : super(key: key);
@override
_FirstPageState createState() => _FirstPageState();
}
class _FirstPageState extends State<FirstPage> {
@override
void initState() {
// TODO: implement initState
super.initState();
Utils.changeStatusColor(color: MyColours.color_199095);
}
@override
Widget build(BuildContext context) {
ScreenUtil.init(context, width: 750, height: 1334);
return Scaffold(
body: Container(
color: MyColours.color_199095,
height: double.infinity,
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(80)),
child: Center(
child: Container(
height: ScreenUtil().setWidth(690),
decoration: BoxDecoration(
color: MyColours.color_ffffff,
borderRadius: BorderRadius.circular(ScreenUtil().setWidth(20)),
),
child: Column(
children: [
VEmptyView(40),
Text(
'温馨提示',
style: TextStyle(
color: MyColours.color_333333,
fontWeight: FontWeight.bold,
fontSize: ScreenUtil().setSp(34)),
),
VEmptyView(40),
MyDivider(double.infinity, ScreenUtil().setWidth(1)),
Expanded(
child: SingleChildScrollView(
child: Column(children: [
VEmptyView(50),
Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(30)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'亲爱的用户,感谢您信任并使用一键订!',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
VEmptyView(16),
Wrap(
children: [
Text(
'我们制定了',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
InkWell(
onTap: () {
NavigatorUtil.goWebPage(
context, '《隐私政策》', "zc",
need: true);
},
child: Text(
'《隐私政策》',
style: TextStyle(
color: MyColours.color_2bb5b7,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
),
Text(
'和',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
InkWell(
onTap: () {
NavigatorUtil.goWebPage(
context, '软件服务协议', "xy",
need: true);
},
child: Text(
'《软件服务协议》',
style: TextStyle(
color: MyColours.color_2bb5b7,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
),
Text(
'请您点击同意之前仔细阅读并充分理解相关条款,其中的重点条款已为您标注,方便您了解自己的权利。',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
],
),
VEmptyView(16),
Text(
'我们将通过《隐私政策》向您说明:\n我们在您使用我们的产品与/或服务时如何收集、使用、保存、共享和转让这些信息,以及我们为您提供的访问、更新、控制和保护这些信息的方式。',
style: TextStyle(
color: MyColours.color_333333,
fontWeight: FontWeight.bold,
fontSize: ScreenUtil().setSp(28),
),
strutStyle: StrutStyle(
forceStrutHeight: true,
height: 1,
leading: 0.3),
),
],
),
)
]),
)),
VEmptyView(40),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
RoundButton(
width: ScreenUtil().setWidth(100 * 2),
height: ScreenUtil().setWidth(70),
radius: ScreenUtil().setWidth(10),
text: '拒绝',
fontSize: 28,
isBold: false,
textColor: MyColours.color_199095,
gradientStart: MyColours.color_efefef,
gradientEnd: MyColours.color_efefef,
onPressed: () {
//修改之前有内容,则弹框
DialogUtil.cupertinoAlertDialog(context,
title: "",
content: "您需要同意《一键订隐私政策》,才能继续使用我们的服务哦。",
lTitle: "暂不",
rTitle: "去同意", lCallback: () {
print("取消");
//退出应用
exit(0);
}, rCallback: () {
print("确定");
});
}),
RoundButton(
width: ScreenUtil().setWidth(100 * 2),
height: ScreenUtil().setWidth(70),
radius: ScreenUtil().setWidth(10),
text: '同意',
fontSize: 28,
isBold: false,
textColor: MyColours.color_ffffff,
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
onPressed: () {
App.sp.setBool("isFirst", false);
//进入应用
NavigatorUtil.goLoginPage(context);
}),
],
),
VEmptyView(40),
],
),
))),
);
}
}
... ...
... ... @@ -19,6 +19,7 @@ import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/navigate_service.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/h_empty_view.dart';
... ... @@ -60,6 +61,9 @@ class LoginState extends State<LoginPage> with WidgetsBindingObserver {
void initState() {
// TODO: implement initState
super.initState();
//第一次打开应用
_checkWechat();
isLogin();
WidgetsBinding.instance.addObserver(this);
... ...
import 'dart:async';
import 'package:device_info/device_info.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:webview_flutter/webview_flutter.dart';
class WebPage extends StatelessWidget {
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/widgets/app_bar.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:url_launcher/url_launcher.dart';
import 'dart:collection';
// import 'package:open_file/open_file.dart';
// import 'package:flutter_downloader/flutter_downloader.dart';
class WebPage extends StatefulWidget {
final String title;
final String url;
final bool need;
const WebPage({Key key, this.title, this.url}) : super(key: key);
const WebPage({Key key, this.title, this.url, this.need = false})
: super(key: key);
@override
Widget build(BuildContext context) {
final Completer<WebViewController> _controller =
Completer<WebViewController>();
return Scaffold(
appBar: SystemAppBar(title, onTap: () {
Navigator.of(context).pop();
}),
body: WebView(
initialUrl: "http://colorcun.com/privacy1.html",
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
// Loading.showLoading(context);
_controller.complete(webViewController);
},
javascriptChannels: <JavascriptChannel>[
_toasterJavascriptChannel(context),
].toSet(),
navigationDelegate: (NavigationRequest request) {
if (request.url.startsWith('https://www.youtube.com/')) {
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
onPageStarted: (String url) {},
onPageFinished: (String url) {
// Loading.hideLoading(context);
},
gestureNavigationEnabled: true,
_WebPageState createState() => _WebPageState();
}
class _WebPageState extends State<WebPage> {
final GlobalKey webViewKey = GlobalKey();
InAppWebViewController webViewController;
InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
crossPlatform: InAppWebViewOptions(
useShouldOverrideUrlLoading: true,
useOnDownloadStart: true,
mediaPlaybackRequiresUserGesture: false,
),
);
android: AndroidInAppWebViewOptions(
useHybridComposition: true,
),
ios: IOSInAppWebViewOptions(
allowsInlineMediaPlayback: true,
));
PullToRefreshController pullToRefreshController;
ContextMenu contextMenu;
String url = "";
double progress = 0;
final urlController = TextEditingController();
// Future<void> openFile(filePath) async {
// final _result = await OpenFile.open(filePath);
// print(_result.message);
// // setState(() {
// // _openResult = "type=${_result.type} message=${_result.message}";
// // });
// }
@override
void initState() {
super.initState();
// Enable hybrid composition.
_init();
}
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
return JavascriptChannel(
name: 'Toaster',
onMessageReceived: (JavascriptMessage message) {
Scaffold.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
});
Future<bool> _checkPermission() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
if (Platform.isAndroid && androidInfo.version.sdkInt <= 28) {
final status = await Permission.storage.status;
if (status != PermissionStatus.granted) {
final result = await Permission.storage.request();
if (result == PermissionStatus.granted) {
return true;
}
} else {
return true;
}
} else {
return true;
}
return false;
}
Future<bool> checkPermissionStorage() async {
var status = await Permission.storage.status;
if (!status.isGranted) {
status = await Permission.storage.request();
if (status.isGranted) {
return true;
}
} else {
return true;
}
return false;
}
_init() async {
// WidgetsFlutterBinding.ensureInitialized();
// await FlutterDownloader.initialize(debug: true);
if (Platform.isAndroid) {
await AndroidInAppWebViewController.setWebContentsDebuggingEnabled(true);
var swAvailable = await AndroidWebViewFeature.isFeatureSupported(
AndroidWebViewFeature.SERVICE_WORKER_BASIC_USAGE);
var swInterceptAvailable = await AndroidWebViewFeature.isFeatureSupported(
AndroidWebViewFeature.SERVICE_WORKER_SHOULD_INTERCEPT_REQUEST);
if (swAvailable && swInterceptAvailable) {
AndroidServiceWorkerController serviceWorkerController =
AndroidServiceWorkerController.instance();
serviceWorkerController.serviceWorkerClient =
AndroidServiceWorkerClient(
shouldInterceptRequest: (request) async {
print(request);
return null;
},
);
}
}
// await FlutterDownloader.initialize(
// debug: true // optional: set false to disable printing logs to console
// );
await Permission.storage.request();
}
@override
Widget build(BuildContext context) {
return Scaffold(
// We're using a Builder here so we have a context that is below the Scaffold
// to allow calling Scaffold.of(context) so we can show a snackbar.
appBar: SystemAppBar(
widget.title,
onTap: () {
if (widget.need) {
Utils.changeStatusColor(color: MyColours.color_199095);
}
Navigator.of(context).pop();
},
),
body: WillPopScope(
onWillPop: () async {
if (widget.need) {
Utils.changeStatusColor(color: MyColours.color_199095);
}
return true;
},
child: Column(
children: [
Expanded(
child: InAppWebView(
key: webViewKey,
// contextMenu: contextMenu,
initialUrlRequest: URLRequest(
url: Uri.parse("http://colorcun.com/privacy1.html")),
// initialFile: "assets/index.html",
initialUserScripts: UnmodifiableListView<UserScript>([]),
initialOptions: options,
pullToRefreshController: pullToRefreshController,
onWebViewCreated: (controller) {
webViewController = controller;
},
onLoadStart: (controller, url) {
setState(() {
this.url = url.toString();
urlController.text = this.url;
});
},
androidOnPermissionRequest:
(controller, origin, resources) async {
return PermissionRequestResponse(
resources: resources,
action: PermissionRequestResponseAction.GRANT);
},
shouldOverrideUrlLoading:
(controller, navigationAction) async {
var uri = navigationAction.request.url;
if (![
"http",
"https",
"file",
"chrome",
"data",
"javascript",
"about"
].contains(uri.scheme)) {
if (await canLaunch(url)) {
// Launch the App
await launch(
url,
);
// and cancel the request
return NavigationActionPolicy.CANCEL;
}
}
return NavigationActionPolicy.ALLOW;
},
onLoadStop: (controller, url) async {
pullToRefreshController.endRefreshing();
setState(() {
this.url = url.toString();
urlController.text = this.url;
});
},
onLoadError: (controller, url, code, message) {
pullToRefreshController.endRefreshing();
},
onProgressChanged: (controller, progress) {
if (progress == 100) {
pullToRefreshController.endRefreshing();
}
setState(() {
this.progress = progress / 100;
urlController.text = this.url;
});
},
onUpdateVisitedHistory: (controller, url, androidIsReload) {
setState(() {
this.url = url.toString();
urlController.text = this.url;
});
},
onConsoleMessage: (controller, consoleMessage) {
print(consoleMessage);
},
onDownloadStart: (controller, url) async {
print("onDownloadStart $url");
Utils.showToast('开始下载...');
// final taskId = await FlutterDownloader.enqueue(
// url: url.toString(),
// savedDir: (await getExternalStorageDirectory()).path,
// showNotification:
// true, // show download progress in status bar (for Android)
// openFileFromNotification:
// true, // click on notification to open downloaded file (for Android)
// );
final dir = await getExternalStorageDirectory();
String savePath = dir.path + "/one_key";
Directory directory = new Directory(savePath);
if (directory.existsSync()) {
//删除历史apk
final List<FileSystemEntity> files = directory.listSync();
for (FileSystemEntity file in files) {
file.deleteSync();
}
}
DioUtil().download(url.toString(), savePath,
onProgress: (received, total) {
// if (_progress != 100) {
// int progress = ((received / total) * 100).round();
// _progress = progress;
// _setState(() {});
// }
if (received == total) {
print('object');
Utils.showToast('文件已保存在${savePath}');
// openFile(savePath);
//下载完成
// InstallPlugin.installApk(savePath, "com.naji.one_key");
}
});
// },
// DioUtil().download(url.toString(),
// (await getExternalStorageDirectory()).path,
// onProgress: (received, total) {
// // if (_progress != 100) {
// // int progress = ((received / total) * 100).round();
// // _progress = progress;
// // _setState(() {});
// // }
// if (received == total) {
// //下载完成
// // InstallPlugin.installApk(savePath, "com.naji.one_key");
// }
// });
},
))
],
)
// Builder(builder: (BuildContext context) {
// return WebView(
// initialUrl: "http://colorcun.com/privacy1.html",
// javascriptMode: JavascriptMode.unrestricted,
// onWebViewCreated: (WebViewController webViewController) {
// _controller.complete(webViewController);
// },
// // TODO(iskakaushik): Remove this when collection literals makes it to stable.
// // ignore: prefer_collection_literals
// javascriptChannels: <JavascriptChannel>[
// _toasterJavascriptChannel(context),
// ].toSet(),
// navigationDelegate: (NavigationRequest request) {
// if (request.url.startsWith('https://www.youtube.com/')) {
// print('blocking navigation to $request}');
// return NavigationDecision.prevent;
// }
// print('allowing navigation to $request');
// return NavigationDecision.navigate;
// },
// onPageStarted: (String url) {
// print('Page started loading: $url');
// },
// onPageFinished: (String url) async {
// print('Page finished loading: $url');
// // showDownloadProgress(context);
// final dir = await getExternalStorageDirectory();
// String savePath = dir.path + "/one_key";
// DioUtil().download(url, savePath,
// onProgress: (received, total) {
// // if (_progress != 100) {
// // int progress = ((received / total) * 100).round();
// // _progress = progress;
// // _setState(() {});
// // }
// if (received == total) {
// print('object');
// //下载完成
// // InstallPlugin.installApk(savePath, "com.naji.one_key");
// }
// });
// },
// gestureNavigationEnabled: true,
// );
// }),
));
}
// JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
// return JavascriptChannel(
// name: 'Toaster',
// onMessageReceived: (JavascriptMessage message) {
// Scaffold.of(context).showSnackBar(
// SnackBar(content: Text(message.message)),
// );
// });
// }
}
// class WebPage extends StatelessWidget {
// final String title;
// final String url;
// final bool need;
// const WebPage({Key key, this.title, this.url, this.need = false})
// : super(key: key);
// @override
// Widget build(BuildContext context) {
// final Completer<WebViewController> _controller =
// Completer<WebViewController>();
// return Scaffold(
// appBar: SystemAppBar(title, onTap: () {
// if (need) {
// Utils.changeStatusColor(color: MyColours.color_199095);
// }
// Navigator.of(context).pop();
// }),
// body: WillPopScope(
// onWillPop: () async {
// if (need) {
// Utils.changeStatusColor(color: MyColours.color_199095);
// }
// return true;
// },
// child: WebView(
// initialUrl: "http://colorcun.com/privacy1.html",
// javascriptMode: JavascriptMode.unrestricted,
// onWebViewCreated: (WebViewController webViewController) {
// // Loading.showLoading(context);
// _controller.complete(webViewController);
// },
// javascriptChannels: <JavascriptChannel>[
// _toasterJavascriptChannel(context),
// ].toSet(),
// navigationDelegate: (NavigationRequest request) {
// if (request.url.startsWith('https://www.youtube.com/')) {
// return NavigationDecision.prevent;
// }
// return NavigationDecision.navigate;
// },
// onPageStarted: (String url) {},
// onPageFinished: (String url) {
// // Loading.hideLoading(context);
// },
// gestureNavigationEnabled: true,
// )),
// );
// }
// JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
// return JavascriptChannel(
// name: 'Toaster',
// onMessageReceived: (JavascriptMessage message) {
// Scaffold.of(context).showSnackBar(
// SnackBar(content: Text(message.message)),
// );
// });
// }
// }
... ...
... ... @@ -559,6 +559,18 @@ class MyPageState extends State<MyPage> with WidgetsBindingObserver {
ScreenUtil().setHeight(1),
color: MyColours.color_f3f3f3,
),
MyItem(
title: "隐私政策",
content: "",
callback: () {
NavigatorUtil.goWebPage(context, '隐私政策', "zc", need: true);
},
),
MyDivider(
double.infinity,
ScreenUtil().setHeight(1),
color: MyColours.color_f3f3f3,
),
VEmptyView(40),
Consumer<UserModel>(
builder:
... ...
... ... @@ -139,10 +139,11 @@ class NavigatorUtil {
///协议
static Future<dynamic> goWebPage(
BuildContext context, String title, String url) {
BuildContext context, String title, String url,
{bool need = false}) {
return _navigateTo(
context,
"${Routes.web_page}?title=${Uri.encodeComponent(title)}&url=$url",
"${Routes.web_page}?title=${Uri.encodeComponent(title)}&url=$url&need=${need}",
);
}
... ...
... ... @@ -293,7 +293,8 @@ var webPageHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
String _title = params["title"].first;
String _url = params["url"].first;
return WebPage(title: _title, url: _url);
bool need = params["need"].first == "true" ? true : false;
return WebPage(title: _title, url: _url, need: need);
});
// 跳转到变更预订
... ...
... ... @@ -398,6 +398,13 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.1"
flutter_inappwebview:
dependency: "direct main"
description:
name: flutter_inappwebview
url: "https://pub.flutter-io.cn"
source: hosted
version: "5.3.2"
flutter_native_image:
dependency: "direct main"
description:
... ...
... ... @@ -139,6 +139,10 @@ dependencies:
flutter_staggered_grid_view: ^0.4.1
# webview
# webview_flutter: ^2.0.13
flutter_inappwebview: ^5.3.2
# flutter_downloader: ^1.7.1
# open_file: ^3.2.1
webview_flutter:
path: library/webview_flutter-2.0.13-copy_inappwebview_select_file_20210930
sendsms:
... ...