A Flutter app that replaces paper delivery receipts — drivers scan the invoice barcode, photograph the signed receipt, and the record is stored on the device.
A freight driver delivers goods and needs proof: the invoice (NF-e) data and a photo of the signed receipt. Done on paper, that proof gets lost, damaged or never reaches the office.
This app puts the whole flow in the driver's pocket, offline-first, so it works on the road where there is no signal.
1. Driver scans the NF-e barcode with the phone camera
2. App reads the invoice key and shows the data
3. Driver photographs the signed receipt (canhoto)
4. Record is saved locally on the device
5. Office retrieves the stored records
Each record keeps the invoice code and the receipt image together, so the proof is never separated from the delivery it belongs to.
- Barcode scanning with the device camera (
simple_barcode_scanner) - Receipt photography with the camera or gallery (
image_picker) - Local persistence with SQLite (
sqflite) — works with no connection - Brazilian document formatting for invoice keys (
brasil_fields) - Record list with the ability to review and delete entries
- Custom splash screen and branding
| Layer | Technology |
|---|---|
| Framework | Flutter (Dart SDK ≥ 3.1) |
| Local database | SQLite via sqflite |
| Scanning | simple_barcode_scanner |
| Camera / gallery | image_picker |
| Formatting | brasil_fields, intl |
The data layer is a singleton database connection with a table per record type, exposing async methods for insert, query and delete. Screens are StatefulWidgets that load their data in initState and re-render on change.
lib/
├── main.dart # app entry and routing
├── db_conexao.dart # SQLite connection + CRUD (singleton)
├── salvaCodigo.dart # capture screen: scan + photograph
├── listaCodigo.dart # saved records list
└── clipboard.dart # clipboard helpers
flutter pub get
flutter runTo build for Android:
flutter build apk --releaseWorking prototype, in use to validate the driver workflow. The data layer is device-local by design — the next step is syncing records to the company backend when a connection is available.