flutter_iban_scanner 0.2.0 copy "flutter_iban_scanner: ^0.2.0" to clipboard
flutter_iban_scanner: ^0.2.0 copied to clipboard

A simple package for scanning IBANs by camera and text recognition.

example/lib/main.dart

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter_iban_scanner/flutter_iban_scanner.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  runApp(
    MyApp(),
  );
}

GlobalKey scaffold = GlobalKey();

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DismissKeyboard(
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        theme: _theme,
        home: Home(),
      ),
    );
  }
}

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  late TextEditingController _ibanController;
  late List<CameraDescription> cameras;

  @override
  void initState() {
    super.initState();
    _initCameras();
    _ibanController = TextEditingController();
  }

  @override
  void dispose() {
    _ibanController.dispose();
    super.dispose();
  }

  void _initCameras() async {
    cameras = await availableCameras();
  }

  @override
  Widget build(BuildContext context) {
    FocusNode focusNode = FocusNode();

    return Scaffold(
      key: scaffold,
      appBar: AppBar(
        title: Text('IBAN Scanner Demo App'),
        centerTitle: true,
        elevation: 0,
      ),
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Padding(
              padding: EdgeInsets.symmetric(horizontal: 16),
              child: TextField(
                controller: _ibanController,
                onChanged: (iban) => _ibanController.value.copyWith(
                  text: iban,
                  selection: TextSelection(
                    baseOffset: iban.length,
                    extentOffset: iban.length,
                  ),
                ),
                // inputFormatters: [
                //   MaskTextInputFormatter(
                //     mask: '## #### #### #### #### #### #### ####',
                //   ),
                // ],
                focusNode: focusNode,
                decoration: InputDecoration(
                  labelText: "IBAN",
                  labelStyle: TextStyle(color: Theme.of(context).primaryColor),
                  enabledBorder: OutlineInputBorder(
                    borderSide:
                        BorderSide(color: Theme.of(context).primaryColor),
                  ),
                  focusedBorder: OutlineInputBorder(
                    borderSide:
                        BorderSide(color: Theme.of(context).primaryColor),
                  ),
                  hintText: 'CH ....',
                  suffixIcon: IconButton(
                    icon: Icon(
                      Icons.camera_alt,
                      color: Theme.of(context).primaryColor,
                    ),
                    onPressed: () => {
                      focusNode.unfocus(),
                      focusNode.canRequestFocus = false,
                      Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) => IBANScannerView(
                            cameras: cameras,
                            onScannerResult: (iban) => {
                              Navigator.of(scaffold.currentContext!).pop(),
                              _showMyDialog(iban),
                            },
                            allowImagePicker: false,
                            allowCameraSwitch: false,
                          ),
                        ),
                      ),
                      Future.delayed(
                        Duration(milliseconds: 100),
                        () {
                          focusNode.canRequestFocus = true;
                        },
                      ),
                    },
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _showMyDialog(iban) async {
    return showDialog<void>(
      context: scaffold.currentContext!,
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return AlertDialog(
          title: const Text('IBAN found!'),
          content: Text(iban),
          actions: <Widget>[
            TextButton(
              child: const Text('Retry'),
              onPressed: () {
                Navigator.of(context).pop();
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    builder: (context) => IBANScannerView(
                      cameras: cameras,
                      onScannerResult: (iban) => {
                        Navigator.of(scaffold.currentContext!).pop(),
                        _showMyDialog(iban),
                      },
                      allowImagePicker: false,
                      allowCameraSwitch: false,
                    ),
                  ),
                );
              },
            ),
            TextButton(
              child: const Text('Correct'),
              onPressed: () {
                Navigator.of(context).pop();
                _ibanController.text = iban;
              },
            ),
          ],
        );
      },
    );
  }
}

// The DismissKeybaord widget (it's reusable)
class DismissKeyboard extends StatelessWidget {
  final Widget child;
  DismissKeyboard({required this.child});

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScopeNode currentFocus = FocusScope.of(context);
        if (!currentFocus.hasPrimaryFocus &&
            currentFocus.focusedChild != null) {
          FocusManager.instance.primaryFocus!.unfocus();
        }
      },
      child: child,
    );
  }
}

final _theme = ThemeData(
  primaryColor: Color(0xff009ACE),
);
12
likes
140
points
19
downloads

Publisher

unverified uploader

Weekly Downloads

A simple package for scanning IBANs by camera and text recognition.

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

camera, flutter, google_ml_kit, iban, image_picker

More

Packages that depend on flutter_iban_scanner