What is Flutter? Flutter is an open-source mobile UI framework created by Google and it released in May 2017. In simple words, It allows creating of a native mobile application with only one codebase.
How to make QR Code Scanner and Generator app in Flutter ?
Step 1. Create your flutter project. Type on Terminal or cmd flutter create my_project_name . Make sure before typing this command you must have connected your pc with the internet.
Step 2. Add dependency. Go to pub.dev and search flutter_barcode_scanner and barcode_widget this to packages help to create QR code and scanner QR code.
flutter_barcode_scanner – This package is help to scanning the bar code. barcode_widget – This packages help to scanning QR code.
step 3. Creating screens or widgets. Go to lib/main.dart and this Code
import 'package:flutter/material.dart';
import 'package:qrcode/screens/home.dart';
class MyApp extends StatelessWidget {
// This widget is the root of your application.
Widget build ( BuildContext context ) {
debugShowCheckedModeBanner: false ,
title: 'QR Code Scanner',
primaryColor: Colors. red ,
import 'package:flutter/material.dart';
import 'package:qrcode/screens/home.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'QR Code Scanner',
theme: ThemeData(
primaryColor: Colors.red,
),
home: HomeScreen());
}
}
import 'package:flutter/material.dart';
import 'package:qrcode/screens/home.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'QR Code Scanner',
theme: ThemeData(
primaryColor: Colors.red,
),
home: HomeScreen());
}
}
and create screen folder in the lib directory and on screen folder create home.dart file.
import 'package:flutter/material.dart';
import 'package:qrcode/widgets/buttonwidget.dart';
import 'QRCreateScreen.dart';
import 'QRScanScreen.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen ({ Key? key }) : super ( key: key ) ;
_HomeScreenState createState () = > _HomeScreenState () ;
class _HomeScreenState extends State < HomeScreen > {
Widget build ( BuildContext context ) {
title: Text ( 'QR Code Scanner' ) ,
mainAxisAlignment: MainAxisAlignment. center ,
textBut: 'Create QR code',
onClick: () = > Navigator. of ( context ) . push ( MaterialPageRoute (
builder: ( BuildContext context ) = > QRCreateScreen () ,
Navigator. of ( context ) . push (
// builder: (BuildContext context) => QRScanPage(),
builder: ( BuildContext context ) = > QRScanScreen ()) ,
import 'package:flutter/material.dart';
import 'package:qrcode/widgets/buttonwidget.dart';
import 'QRCreateScreen.dart';
import 'QRScanScreen.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('QR Code Scanner'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ButtonWidget(
textBut: 'Create QR code',
onClick: () => Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => QRCreateScreen(),
)),
),
const SizedBox(
height: 32,
),
ButtonWidget(
textBut: 'Scan QR Code',
onClick: () => {
Navigator.of(context).push(
MaterialPageRoute(
// builder: (BuildContext context) => QRScanPage(),
builder: (BuildContext context) => QRScanScreen()),
)
},
),
],
),
),
);
}
}
import 'package:flutter/material.dart';
import 'package:qrcode/widgets/buttonwidget.dart';
import 'QRCreateScreen.dart';
import 'QRScanScreen.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({Key? key}) : super(key: key);
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('QR Code Scanner'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ButtonWidget(
textBut: 'Create QR code',
onClick: () => Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => QRCreateScreen(),
)),
),
const SizedBox(
height: 32,
),
ButtonWidget(
textBut: 'Scan QR Code',
onClick: () => {
Navigator.of(context).push(
MaterialPageRoute(
// builder: (BuildContext context) => QRScanPage(),
builder: (BuildContext context) => QRScanScreen()),
)
},
),
],
),
),
);
}
}
QRCreateScreen.dart in screen directory.
import 'package:barcode_widget/barcode_widget.dart';
import 'package:flutter/material.dart';
class QRCreateScreen extends StatefulWidget {
const QRCreateScreen ({ Key? key }) : super ( key: key ) ;
_QRCreateScreenState createState () = > _QRCreateScreenState () ;
class _QRCreateScreenState extends State < QRCreateScreen > {
final controller = TextEditingController () ;
Widget build ( BuildContext context ) = > Scaffold (
title: Text ( 'Generate QR Code' ) ,
child: SingleChildScrollView (
padding: EdgeInsets. all ( 24 ) ,
mainAxisAlignment: MainAxisAlignment. center ,
barcode: Barcode. qrCode () ,
Expanded ( child: buildTextField ( context )) ,
const SizedBox ( width: 12 ) ,
backgroundColor: Theme. of ( context ) . primaryColor ,
child: Icon ( Icons. done , size: 30 ) ,
onPressed: () = > setState (() {}) ,
Widget buildTextField ( BuildContext context ) = > TextField (
fontWeight: FontWeight. bold ,
decoration: InputDecoration (
hintText: 'Enter the data',
hintStyle: TextStyle ( color: Colors. grey ) ,
enabledBorder: OutlineInputBorder (
borderRadius: BorderRadius. circular ( 8 ) ,
borderSide: BorderSide ( color: Colors. black ) ,
focusedBorder: OutlineInputBorder (
borderRadius: BorderRadius. circular ( 8 ) ,
color: Theme. of ( context ) . primaryColor ,
import 'package:barcode_widget/barcode_widget.dart';
import 'package:flutter/material.dart';
class QRCreateScreen extends StatefulWidget {
const QRCreateScreen({Key? key}) : super(key: key);
@override
_QRCreateScreenState createState() => _QRCreateScreenState();
}
class _QRCreateScreenState extends State<QRCreateScreen> {
final controller = TextEditingController();
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('Generate QR Code'),
),
body: Center(
child: SingleChildScrollView(
padding: EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
controller.text.isEmpty
? Container(
width: 200,
height: 200,
)
: BarcodeWidget(
barcode: Barcode.qrCode(),
color: Colors.black,
data: controller.text,
width: 200,
height: 200,
),
SizedBox(height: 40),
Row(
children: [
Expanded(child: buildTextField(context)),
const SizedBox(width: 12),
FloatingActionButton(
backgroundColor: Theme.of(context).primaryColor,
child: Icon(Icons.done, size: 30),
onPressed: () => setState(() {}),
)
],
),
],
),
),
),
);
Widget buildTextField(BuildContext context) => TextField(
controller: controller,
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20,
),
decoration: InputDecoration(
hintText: 'Enter the data',
hintStyle: TextStyle(color: Colors.grey),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(color: Colors.black),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Theme.of(context).primaryColor,
),
),
),
);
}
import 'package:barcode_widget/barcode_widget.dart';
import 'package:flutter/material.dart';
class QRCreateScreen extends StatefulWidget {
const QRCreateScreen({Key? key}) : super(key: key);
@override
_QRCreateScreenState createState() => _QRCreateScreenState();
}
class _QRCreateScreenState extends State<QRCreateScreen> {
final controller = TextEditingController();
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text('Generate QR Code'),
),
body: Center(
child: SingleChildScrollView(
padding: EdgeInsets.all(24),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
controller.text.isEmpty
? Container(
width: 200,
height: 200,
)
: BarcodeWidget(
barcode: Barcode.qrCode(),
color: Colors.black,
data: controller.text,
width: 200,
height: 200,
),
SizedBox(height: 40),
Row(
children: [
Expanded(child: buildTextField(context)),
const SizedBox(width: 12),
FloatingActionButton(
backgroundColor: Theme.of(context).primaryColor,
child: Icon(Icons.done, size: 30),
onPressed: () => setState(() {}),
)
],
),
],
),
),
),
);
Widget buildTextField(BuildContext context) => TextField(
controller: controller,
style: TextStyle(
color: Colors.black,
fontWeight: FontWeight.bold,
fontSize: 20,
),
decoration: InputDecoration(
hintText: 'Enter the data',
hintStyle: TextStyle(color: Colors.grey),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(color: Colors.black),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
borderSide: BorderSide(
color: Theme.of(context).primaryColor,
),
),
),
);
}
QRScanScreen.dart in screen directory.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:qrcode/widgets/buttonwidget.dart';
class QRScanScreen extends StatefulWidget {
const QRScanScreen ({ Key? key }) : super ( key: key ) ;
_QRScanScreenState createState () = > _QRScanScreenState () ;
class _QRScanScreenState extends State < QRScanScreen > {
Widget build ( BuildContext context ) {
title: Text ( 'Scan QR Code' ) ,
padding: const EdgeInsets. all ( 10.0 ) ,
mainAxisAlignment: MainAxisAlignment. center ,
mainAxisAlignment: MainAxisAlignment. spaceBetween ,
fontWeight: FontWeight. bold ,
ClipboardData ( text: qrCode. isEmpty ? '' : qrCode )) ;
ScaffoldMessenger. of ( context ) . showSnackBar (
SnackBar ( content: Text ( "Copied to Clipboard" ))) ;
fontWeight: FontWeight. bold ,
textBut: 'Start QR scan', onClick: () = > scanQRCode ()) ,
// this functin will help to scann qr code.
Future < void > scanQRCode () async {
final qrCode = await FlutterBarcodeScanner. scanBarcode (
qrCode = 'Failed to get platform version.';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:qrcode/widgets/buttonwidget.dart';
class QRScanScreen extends StatefulWidget {
const QRScanScreen({Key? key}) : super(key: key);
@override
_QRScanScreenState createState() => _QRScanScreenState();
}
class _QRScanScreenState extends State<QRScanScreen> {
String qrCode = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Scan QR Code'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Scan Result',
style: TextStyle(
fontSize: 25,
color: Colors.black54,
fontWeight: FontWeight.bold,
),
),
IconButton(
onPressed: () {
Clipboard.setData(
ClipboardData(text: qrCode.isEmpty ? '' : qrCode));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Copied to Clipboard")));
},
icon: Icon(Icons.copy),
iconSize: 25,
)
],
),
SizedBox(height: 8),
Text(
qrCode.toString(),
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black54,
),
),
SizedBox(height: 60),
ButtonWidget(
textBut: 'Start QR scan', onClick: () => scanQRCode()),
],
),
),
),
);
}
// this functin will help to scann qr code.
Future<void> scanQRCode() async {
try {
final qrCode = await FlutterBarcodeScanner.scanBarcode(
'#ff6666',
"cancal",
true,
ScanMode.QR,
);
if (!mounted) return;
setState(() {
this.qrCode = qrCode;
print(qrCode);
});
} on PlatformException {
qrCode = 'Failed to get platform version.';
}
}
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:qrcode/widgets/buttonwidget.dart';
class QRScanScreen extends StatefulWidget {
const QRScanScreen({Key? key}) : super(key: key);
@override
_QRScanScreenState createState() => _QRScanScreenState();
}
class _QRScanScreenState extends State<QRScanScreen> {
String qrCode = '';
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Scan QR Code'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Scan Result',
style: TextStyle(
fontSize: 25,
color: Colors.black54,
fontWeight: FontWeight.bold,
),
),
IconButton(
onPressed: () {
Clipboard.setData(
ClipboardData(text: qrCode.isEmpty ? '' : qrCode));
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Copied to Clipboard")));
},
icon: Icon(Icons.copy),
iconSize: 25,
)
],
),
SizedBox(height: 8),
Text(
qrCode.toString(),
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black54,
),
),
SizedBox(height: 60),
ButtonWidget(
textBut: 'Start QR scan', onClick: () => scanQRCode()),
],
),
),
),
);
}
// this functin will help to scann qr code.
Future<void> scanQRCode() async {
try {
final qrCode = await FlutterBarcodeScanner.scanBarcode(
'#ff6666',
"cancal",
true,
ScanMode.QR,
);
if (!mounted) return;
setState(() {
this.qrCode = qrCode;
print(qrCode);
});
} on PlatformException {
qrCode = 'Failed to get platform version.';
}
}
}
lib/widgets/buttonwidget.dart
import 'package:flutter/material.dart';
class ButtonWidget extends StatelessWidget {
final VoidCallback? onClick;
const ButtonWidget ({ Key? key, @ required this. textBut , @ required this. onClick })
Widget build ( BuildContext context ) = > RaisedButton (
style: TextStyle ( fontSize: 24 ) ,
color: Theme. of ( context ) . primaryColor ,
padding: EdgeInsets. symmetric ( horizontal: 16 , vertical: 8 ) ,
import 'package:flutter/material.dart';
class ButtonWidget extends StatelessWidget {
final String? textBut;
final VoidCallback? onClick;
const ButtonWidget({Key? key, @required this.textBut, @required this.onClick})
: super(key: key);
@override
Widget build(BuildContext context) => RaisedButton(
child: Text(
textBut.toString(),
style: TextStyle(fontSize: 24),
),
shape: StadiumBorder(),
color: Theme.of(context).primaryColor,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
textColor: Colors.white,
onPressed: onClick);
}
import 'package:flutter/material.dart';
class ButtonWidget extends StatelessWidget {
final String? textBut;
final VoidCallback? onClick;
const ButtonWidget({Key? key, @required this.textBut, @required this.onClick})
: super(key: key);
@override
Widget build(BuildContext context) => RaisedButton(
child: Text(
textBut.toString(),
style: TextStyle(fontSize: 24),
),
shape: StadiumBorder(),
color: Theme.of(context).primaryColor,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
textColor: Colors.white,
onPressed: onClick);
}
This is the code to create QR code scanner and QR code Creater