This commit is contained in:
2022-06-15 10:18:33 +08:00
commit 58777bf6d6
74 changed files with 2423 additions and 0 deletions

43
lib/main.dart Normal file
View 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
View 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,
),
))
],
),
);
}
}

View 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
View 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();
}
}

View 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);
}

View File

@@ -0,0 +1,5 @@
import 'package:qr_code_scanner/qr_code_scanner.dart';
void qrscanner() {
}

View 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,
));
}
},
),
),
),
],
);
}
}

View 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,
),),
);
}
}

View 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,
),),
);
}
}

View 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,
),),
);
}
}