passcode_screen 2.0.1 passcode_screen: ^2.0.1 copied to clipboard
A platform agnostic Flutter package for showing passcode input screen, similar to Native iOS. Screen customizable with a colors, sizes, fonts etc.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:passcode_screen/circle.dart';
import 'package:passcode_screen/keyboard.dart';
import 'package:passcode_screen/passcode_screen.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Passcode Lock Screen Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: ExampleHomePage(title: 'Passcode Lock Screen Example'),
);
}
}
const storedPasscode = '123456';
class ExampleHomePage extends StatefulWidget {
ExampleHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<StatefulWidget> createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage> {
final StreamController<bool> _verificationNotifier =
StreamController<bool>.broadcast();
bool isAuthenticated = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('You are ${isAuthenticated ? '' : 'NOT'} authenticated'),
_defaultLockScreenButton(context),
_customColorsLockScreenButton(context)
],
),
),
);
}
_defaultLockScreenButton(BuildContext context) => MaterialButton(
color: Theme.of(context).primaryColor,
child: Text('Open Default Lock Screen'),
onPressed: () {
_showLockScreen(
context,
opaque: false,
cancelButton: Text(
'Cancel',
style: const TextStyle(fontSize: 16, color: Colors.white),
semanticsLabel: 'Cancel',
),
);
},
);
_customColorsLockScreenButton(BuildContext context) {
return MaterialButton(
color: Theme.of(context).primaryColor,
child: Text('Open Custom Lock Screen'),
onPressed: () {
_showLockScreen(context,
opaque: false,
circleUIConfig: CircleUIConfig(
borderColor: Colors.blue,
fillColor: Colors.blue,
circleSize: 30),
keyboardUIConfig: KeyboardUIConfig(
digitBorderWidth: 2, primaryColor: Colors.blue),
cancelButton: Icon(
Icons.arrow_back,
color: Colors.blue,
),
digits: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '零']);
},
);
}
_showLockScreen(
BuildContext context, {
required bool opaque,
CircleUIConfig? circleUIConfig,
KeyboardUIConfig? keyboardUIConfig,
required Widget cancelButton,
List<String>? digits,
}) {
Navigator.push(
context,
PageRouteBuilder(
opaque: opaque,
pageBuilder: (context, animation, secondaryAnimation) =>
PasscodeScreen(
title: Text(
'Enter App Passcode',
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: 28),
),
circleUIConfig: circleUIConfig,
keyboardUIConfig: keyboardUIConfig,
passwordEnteredCallback: _onPasscodeEntered,
cancelButton: cancelButton,
deleteButton: Text(
'Delete',
style: const TextStyle(fontSize: 16, color: Colors.white),
semanticsLabel: 'Delete',
),
shouldTriggerVerification: _verificationNotifier.stream,
backgroundColor: Colors.black.withOpacity(0.8),
cancelCallback: _onPasscodeCancelled,
digits: digits,
passwordDigits: 6,
bottomWidget: _buildPasscodeRestoreButton(),
),
));
}
_onPasscodeEntered(String enteredPasscode) {
bool isValid = storedPasscode == enteredPasscode;
_verificationNotifier.add(isValid);
if (isValid) {
setState(() {
this.isAuthenticated = isValid;
});
}
}
_onPasscodeCancelled() {
Navigator.maybePop(context);
}
@override
void dispose() {
_verificationNotifier.close();
super.dispose();
}
_buildPasscodeRestoreButton() => Align(
alignment: Alignment.bottomCenter,
child: Container(
margin: const EdgeInsets.only(bottom: 10.0, top: 20.0),
child: TextButton(
child: Text(
"Reset passcode",
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 16,
color: Colors.white,
fontWeight: FontWeight.w300),
),
onPressed: _resetAppPassword,
// splashColor: Colors.white.withOpacity(0.4),
// highlightColor: Colors.white.withOpacity(0.2),
// ),
),
),
);
_resetAppPassword() {
Navigator.maybePop(context).then((result) {
if (!result) {
return;
}
_showRestoreDialog(() {
Navigator.maybePop(context);
//TODO: Clear your stored passcode here
});
});
}
_showRestoreDialog(VoidCallback onAccepted) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text(
"Reset passcode",
style: const TextStyle(color: Colors.black87),
),
content: Text(
"Passcode reset is a non-secure operation!\n\nConsider removing all user data if this action performed.",
style: const TextStyle(color: Colors.black87),
),
actions: <Widget>[
// usually buttons at the bottom of the dialog
TextButton(
child: Text(
"Cancel",
style: const TextStyle(fontSize: 18),
),
onPressed: () {
Navigator.maybePop(context);
},
),
TextButton(
child: Text(
"I understand",
style: const TextStyle(fontSize: 18),
),
onPressed: onAccepted,
),
],
);
},
);
}
}