This commit is contained in:
nicco 2018-08-30 15:23:14 +02:00
parent bd56a63300
commit 7ecd7e9519
9 changed files with 287 additions and 0 deletions

View File

@ -0,0 +1,23 @@
import 'package:flutter/material.dart';
class BG extends StatelessWidget {
BG({@required this.child});
final Widget child;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: child,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [Color(0xFF6FABFF), Color(0xFFE4FF71)],
),
),
),
);
}
}

View File

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
class Button extends StatelessWidget {
Button({@required this.text, @required this.callback});
final String text;
final Function callback;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: this.callback,
child: Container(
width: 180.0,
height: 45.0,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100.0),
border: Border.all(width: 1.0, color: const Color(0xFF000000))),
child: Center(
child: Text(
text,
style: TextStyle(fontSize: 20.0),
))));
}
}

View File

@ -0,0 +1,21 @@
import 'package:flutter/material.dart';
class ListItem extends StatelessWidget {
ListItem({this.left, this.right});
final int left;
final String right;
Widget build(BuildContext context) {
return Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Container(
margin: const EdgeInsets.only(right: 4.0),
child: Text('${left.toString()}.',
style: TextStyle(fontWeight: FontWeight.bold))),
Text(right, style: TextStyle())
],
);
}
}

View File

@ -0,0 +1,26 @@
import 'package:flutter/material.dart';
class Logo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Stack(overflow: Overflow.visible, children: <Widget>[
Text(
"QR NOTIFICATOR",
style: TextStyle(fontFamily: "Jaapokki", fontSize: 30.0),
),
Positioned(
right: -20.0,
top: -5.0,
child: Container(
width: 20.0,
height: 20.0,
child: Center(
child: Text('2', style: TextStyle(fontFamily: "Jaapokki"))),
decoration: new BoxDecoration(
color: Colors.orange,
shape: BoxShape.circle,
)),
)
]);
}
}

View File

@ -0,0 +1,37 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
class SyncIcon extends StatefulWidget {
_SyncIcon createState() => _SyncIcon();
}
class _SyncIcon extends State<SyncIcon> with SingleTickerProviderStateMixin {
Animation<double> animation;
AnimationController controller;
initState() {
super.initState();
controller = AnimationController(
duration: const Duration(milliseconds: 2000), vsync: this);
animation = Tween(begin: 0.0, end: pi * 2).animate(controller);
animation.addListener(() => setState(() {}));
controller.repeat();
}
Widget build(BuildContext context) {
return Transform.rotate(
angle: animation.value,
child: Container(
margin: EdgeInsets.symmetric(vertical: 10.0),
height: 32.0,
width: 32.0,
child: Image.asset('images/sync.png'),
));
}
dispose() {
controller.dispose();
super.dispose();
}
}

View File

@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
import '../Components/BG.dart';
import '../Components/Button.dart';
import '../Components/ListItem.dart';
import '../Components/Logo.dart';
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BG(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(padding: EdgeInsets.only(bottom: 80.0), child: Logo()),
Button(
callback: () {
// Navigator.pushNamed(context, '/scan');
Navigator.pushNamed(context, '/success/1');
},
text: "Scan",
),
Padding(
padding: const EdgeInsets.only(top: 100.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
ListItem(left: 1, right: 'Open Camera.'),
ListItem(left: 2, right: 'Scan QR code.'),
ListItem(left: 2, right: 'Get notified.'),
],
))
],
)));
}
}

View File

@ -0,0 +1,39 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:barcode_scan/barcode_scan.dart';
import '../Components/BG.dart';
import '../Components/SyncIcon.dart';
class Scan extends StatelessWidget {
Future scan() async {
try {
String barcode = await BarcodeScanner.scan();
print('Success');
print(barcode);
Navigator.pushNamed(null, '/home');
} on PlatformException catch (e) {
if (e.code == BarcodeScanner.CameraAccessDenied)
print('The user did not grant the camera permission!');
} catch (e) {
print('Nope');
print(e);
}
}
@override
Widget build(BuildContext context) => BG(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Text(
'Scanning...',
style: TextStyle(fontWeight: FontWeight.bold),
),
SyncIcon()
],
)));
}

View File

@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import '../Components/BG.dart';
import '../Components/Button.dart';
class Success extends StatelessWidget {
final int result;
Success({@required this.result}) {
final initializationSettings = InitializationSettings(
AndroidInitializationSettings('app_icon'), IOSInitializationSettings());
final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin()
..initialize(initializationSettings);
flutterLocalNotificationsPlugin.show(
this.result,
'🚀 Scan succeded!',
'Your super sercret code is: $result',
NotificationDetails(
AndroidNotificationDetails('your channel id', 'your channel name',
'your channel description',
importance: Importance.Max, priority: Priority.High),
IOSNotificationDetails()),
);
}
@override
Widget build(BuildContext context) => BG(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 150.0, bottom: 100.0),
child: Button(
text: 'Back',
callback: () =>
Navigator.popUntil(context, ModalRoute.withName('/')),
),
),
Text(
'Success',
style: TextStyle(fontWeight: FontWeight.bold),
),
Container(
margin: EdgeInsets.symmetric(vertical: 10.0),
height: 32.0,
width: 32.0,
child: Image.asset('images/check.png'),
)
],
)));
}

25
src/flutter/lib/main.dart Normal file
View File

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'Screens/Home.dart';
import 'Screens/Scan.dart';
import 'Screens/Success.dart';
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) => MaterialApp(
routes: {
'/': (context) => Home(),
'/scan': (context) => Scan(),
},
onGenerateRoute: (routeSettings) {
var path = routeSettings.name.split('/');
final number = path.length > 1 ? int.parse(path[2]) : null;
return MaterialPageRoute(
builder: (context) => Success(result: number),
settings: routeSettings,
);
});
}