init
This commit is contained in:
43
lib/main.dart
Normal file
43
lib/main.dart
Normal file
@@ -0,0 +1,43 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'pages/index.dart';
|
||||
|
||||
void main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
// Android状态栏透明 splash为白色,所以调整状态栏文字为黑色
|
||||
SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(
|
||||
statusBarColor: Colors.transparent,
|
||||
statusBarIconBrightness: Brightness.light);
|
||||
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
|
||||
runApp(MyApp());
|
||||
}
|
||||
|
||||
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({Key? key}) : super(key: key);
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// 强制竖屏
|
||||
SystemChrome.setPreferredOrientations(
|
||||
[DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
|
||||
return ScreenUtilInit(
|
||||
/// 设置设计稿宽高
|
||||
designSize: Size(1180, 820),
|
||||
minTextAdapt: true,
|
||||
splitScreenMode: false,
|
||||
builder: (_) {
|
||||
return GetMaterialApp(
|
||||
title: 'Flutter Demo',
|
||||
locale: Locale('zh', 'CN'),
|
||||
fallbackLocale: Locale('zh', 'CN'),
|
||||
theme: ThemeData(
|
||||
primarySwatch: Colors.red,
|
||||
),
|
||||
home: IndexPage(),
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
67
lib/pages/index.dart
Normal file
67
lib/pages/index.dart
Normal file
@@ -0,0 +1,67 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:pad_start/pages/page1/index.dart';
|
||||
import 'package:pad_start/pages/page2/index.dart';
|
||||
import 'package:pad_start/pages/page3/index.dart';
|
||||
import 'package:pad_start/pages/page4/index.dart';
|
||||
|
||||
class IndexPage extends StatefulWidget {
|
||||
const IndexPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<IndexPage> createState() => _IndexPageState();
|
||||
}
|
||||
|
||||
class _IndexPageState extends State<IndexPage> {
|
||||
List<String> nav = ['首页', '操作', '演示', '我的'];
|
||||
int currentIndex = 0;
|
||||
List<Widget> navWidget = [Page1(), Page2(), Page3(), Page4()];
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Row(
|
||||
children: [
|
||||
Container(
|
||||
width: 100.w,
|
||||
height: double.infinity,
|
||||
color: Colors.grey.withOpacity(0.1),
|
||||
child: Column(
|
||||
children: [
|
||||
...List.generate(nav.length, (index){
|
||||
return Container(
|
||||
margin: EdgeInsets.only(bottom: 10),
|
||||
child: Material(
|
||||
color: Colors.white,
|
||||
child: InkWell(
|
||||
onTap: (){
|
||||
setState((){
|
||||
this.currentIndex = index;
|
||||
});
|
||||
},
|
||||
child: Container(
|
||||
width: 100.w,
|
||||
height: 100.w,
|
||||
alignment: Alignment.center,
|
||||
child: Text('${nav[index]}', style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.bold,
|
||||
),),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
})
|
||||
],
|
||||
),
|
||||
),
|
||||
Expanded(child: Container(
|
||||
child: IndexedStack(
|
||||
index: currentIndex,
|
||||
children: navWidget,
|
||||
),
|
||||
))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
25
lib/pages/page1/index.dart
Normal file
25
lib/pages/page1/index.dart
Normal file
@@ -0,0 +1,25 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'utils/pickAssets.dart';
|
||||
import 'webview.dart';
|
||||
|
||||
class Page1 extends StatefulWidget {
|
||||
const Page1({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<Page1> createState() => _Page1State();
|
||||
}
|
||||
|
||||
class _Page1State extends State<Page1> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Expanded(child: WebViewPage())
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
96
lib/pages/page1/qr.dart
Normal file
96
lib/pages/page1/qr.dart
Normal file
@@ -0,0 +1,96 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:qr_code_scanner/qr_code_scanner.dart';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:qr_flutter/qr_flutter.dart';
|
||||
class QrWidget extends StatefulWidget {
|
||||
const QrWidget({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<QrWidget> createState() => _QrWidgetState();
|
||||
}
|
||||
|
||||
class _QrWidgetState extends State<QrWidget> {
|
||||
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
|
||||
Barcode? result;
|
||||
QRViewController? controller;
|
||||
|
||||
@override
|
||||
initState(){
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
void reassemble() {
|
||||
super.reassemble();
|
||||
// if (Platform.isAndroid) {
|
||||
// controller!.pauseCamera();
|
||||
// } else if (Platform.isIOS) {
|
||||
// controller!.resumeCamera();
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('QR'),
|
||||
centerTitle: true,
|
||||
elevation: 0.0,
|
||||
),
|
||||
body: Column(
|
||||
children: <Widget>[
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Container(
|
||||
width: 300,
|
||||
height: 300,
|
||||
child: QRView(
|
||||
key: qrKey,
|
||||
onQRViewCreated: _onQRViewCreated,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: 300,
|
||||
height: 300,
|
||||
child: QrImage(
|
||||
data: "1234567890",
|
||||
version: QrVersions.auto,
|
||||
size: 200.0,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Center(
|
||||
child: (result != null)
|
||||
? Text(
|
||||
'Barcode Type:Data: ${result!.code}')
|
||||
: Text('Scan a code'),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _onQRViewCreated(QRViewController controller) {
|
||||
this.controller = controller;
|
||||
controller.scannedDataStream.listen((scanData) {
|
||||
setState(() {
|
||||
result = scanData;
|
||||
print(result);
|
||||
});
|
||||
});
|
||||
controller.resumeCamera();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
controller?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
9
lib/pages/page1/utils/pickAssets.dart
Normal file
9
lib/pages/page1/utils/pickAssets.dart
Normal file
@@ -0,0 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||
|
||||
void pickAssets(context) async {
|
||||
final List<AssetEntity>? result = await AssetPicker.pickAssets(context, pickerConfig: AssetPickerConfig(
|
||||
maxAssets: 1,
|
||||
));
|
||||
print(result);
|
||||
}
|
||||
5
lib/pages/page1/utils/qr.dart
Normal file
5
lib/pages/page1/utils/qr.dart
Normal file
@@ -0,0 +1,5 @@
|
||||
import 'package:qr_code_scanner/qr_code_scanner.dart';
|
||||
|
||||
void qrscanner() {
|
||||
|
||||
}
|
||||
141
lib/pages/page1/webview.dart
Normal file
141
lib/pages/page1/webview.dart
Normal file
@@ -0,0 +1,141 @@
|
||||
import 'dart:collection';
|
||||
import 'dart:io';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
|
||||
import 'package:pad_start/pages/page1/qr.dart';
|
||||
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
|
||||
import 'package:wechat_camera_picker/wechat_camera_picker.dart';
|
||||
|
||||
import 'utils/pickAssets.dart';
|
||||
|
||||
|
||||
class WebViewPage extends StatefulWidget {
|
||||
const WebViewPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<WebViewPage> createState() => _WebViewPageState();
|
||||
}
|
||||
|
||||
class _WebViewPageState extends State<WebViewPage> {
|
||||
/// Base
|
||||
String url = 'http://10.80.23.79:3388';
|
||||
String title = 'Document';
|
||||
///
|
||||
final GlobalKey webViewKey = GlobalKey();
|
||||
InAppWebViewController? webViewController;
|
||||
InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
|
||||
crossPlatform: InAppWebViewOptions(
|
||||
useShouldOverrideUrlLoading: true,
|
||||
mediaPlaybackRequiresUserGesture: false),
|
||||
android: AndroidInAppWebViewOptions(
|
||||
useHybridComposition: true,
|
||||
),
|
||||
ios: IOSInAppWebViewOptions(
|
||||
allowsInlineMediaPlayback: true,
|
||||
));
|
||||
late PullToRefreshController pullToRefreshController;
|
||||
late ContextMenu contextMenu;
|
||||
|
||||
@override
|
||||
initState(){
|
||||
pullToRefreshController = PullToRefreshController(
|
||||
options: PullToRefreshOptions(
|
||||
color: Colors.blue,
|
||||
),
|
||||
onRefresh: () async {
|
||||
if (Platform.isAndroid) {
|
||||
webViewController?.reload();
|
||||
} else if (Platform.isIOS) {
|
||||
webViewController?.loadUrl(
|
||||
urlRequest: URLRequest(url: await webViewController?.getUrl()));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
Text('Flutter Call Js', style: TextStyle(
|
||||
fontSize: 38
|
||||
),),
|
||||
SizedBox(height: 20,),
|
||||
RaisedButton(onPressed: (){
|
||||
webViewController?.callAsyncJavaScript(functionBody: 'message.success("123")', arguments: {}, );
|
||||
}, child: Text('message: success'),),
|
||||
RaisedButton(onPressed: (){
|
||||
webViewController?.callAsyncJavaScript(functionBody: 'message.warning("123")', arguments: {}, );
|
||||
}, child: Text('message: warning'),),
|
||||
RaisedButton(onPressed: (){
|
||||
print("发送消息");
|
||||
webViewController?.postWebMessage(message: WebMessage(
|
||||
data: "Hello",
|
||||
ports: [],
|
||||
));
|
||||
}, child: Text('发送消息'),),
|
||||
],
|
||||
),
|
||||
AppBar(
|
||||
title: Text(title, style: TextStyle(
|
||||
fontSize: 18,
|
||||
),),
|
||||
centerTitle: true,
|
||||
),
|
||||
Expanded(
|
||||
child: Container(
|
||||
// InAppWebView Widget
|
||||
child: InAppWebView(
|
||||
key: webViewKey,
|
||||
initialUrlRequest:
|
||||
URLRequest(url: Uri.parse(this.url)),
|
||||
initialUserScripts: UnmodifiableListView<UserScript>([]),
|
||||
initialOptions: options,
|
||||
pullToRefreshController: pullToRefreshController,
|
||||
onWebViewCreated: (controller) async {
|
||||
webViewController = controller;
|
||||
webViewController?.getUrl().then((res){
|
||||
print('请求URL');
|
||||
print(res);
|
||||
});
|
||||
},
|
||||
onLoadStart: (controller, url) {
|
||||
setState(() {
|
||||
this.url = url.toString();
|
||||
});
|
||||
},
|
||||
// 安卓权限请求
|
||||
androidOnPermissionRequest:
|
||||
(controller, origin, resources) async {
|
||||
return PermissionRequestResponse(
|
||||
resources: resources,
|
||||
action: PermissionRequestResponseAction.GRANT);
|
||||
},
|
||||
onConsoleMessage: (controller, consoleMessage) async {
|
||||
print(consoleMessage);
|
||||
print(consoleMessage.message);
|
||||
print(consoleMessage.messageLevel);
|
||||
if(consoleMessage.message=='pluginAssets'){
|
||||
final List<AssetEntity>? result = await AssetPicker.pickAssets(context, pickerConfig: const AssetPickerConfig(
|
||||
));
|
||||
}
|
||||
if(consoleMessage.message=='pluginQR'){
|
||||
Get.to(QrWidget());
|
||||
}
|
||||
if(consoleMessage.message=='pluginVideo'){
|
||||
final AssetEntity? entity = await CameraPicker.pickFromCamera(context, pickerConfig: const CameraPickerConfig(
|
||||
enableRecording: true,
|
||||
));
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
21
lib/pages/page2/index.dart
Normal file
21
lib/pages/page2/index.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class Page2 extends StatefulWidget {
|
||||
const Page2({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<Page2> createState() => _Page2State();
|
||||
}
|
||||
|
||||
class _Page2State extends State<Page2> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
child: Text('Page2', style: TextStyle(
|
||||
fontSize: 38.sp,
|
||||
),),
|
||||
);
|
||||
}
|
||||
}
|
||||
21
lib/pages/page3/index.dart
Normal file
21
lib/pages/page3/index.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class Page3 extends StatefulWidget {
|
||||
const Page3({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<Page3> createState() => _Page3State();
|
||||
}
|
||||
|
||||
class _Page3State extends State<Page3> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
child: Text('Page3', style: TextStyle(
|
||||
fontSize: 38.sp,
|
||||
),),
|
||||
);
|
||||
}
|
||||
}
|
||||
21
lib/pages/page4/index.dart
Normal file
21
lib/pages/page4/index.dart
Normal file
@@ -0,0 +1,21 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
|
||||
class Page4 extends StatefulWidget {
|
||||
const Page4({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<Page4> createState() => _Page4State();
|
||||
}
|
||||
|
||||
class _Page4State extends State<Page4> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
alignment: Alignment.center,
|
||||
child: Text('Page4', style: TextStyle(
|
||||
fontSize: 38.sp,
|
||||
),),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user