You can use an open source SDK (e.g., ZXing) or a commercial SDK (e.g., Dynamsoft Barcode Reader SDK) in your Flutter project. Implementing the barcode scanning function is easy.
I have written an article - Flutter Programming with Android AAR File, sharing how to scan QR code in a flutter project. The source code is also available on GitHub.
Java code
private String onGetBarcode(String json) { String filename; try { JSONObject message = new JSONObject(json); filename = message.getString("filename"); } catch (JSONException e) { Log.e(TAG, "JSON exception", e); return null; } String locationProvider; String barcodeResult = "No barcode detected"; File file = new File(filename); if (!file.exists()) { barcodeResult = "No file exists: " + file.toString(); Toast.makeText(BarcodeReaderActivity.this, barcodeResult, Toast.LENGTH_LONG).show(); return null; } else { Bitmap bitmap = BitmapFactory.decodeFile(file.toString()); BarcodeReader reader = new BarcodeReader("license"); ReadResult result = reader.readSingle(bitmap, Barcode.QR_CODE); Barcode[] all = result.barcodes; if (all != null && all.length == 1) { barcodeResult = all[0].displayValue; } else { barcodeResult = "no barcode found: " + file.toString(); } bitmap.recycle(); } JSONObject reply = new JSONObject(); try { if (barcodeResult != null) { reply.put("result", barcodeResult); } else { reply.put("result", "No barcode detected"); } } catch (JSONException e) { Log.e(TAG, "JSON exception", e); return null; } return reply.toString(); }
Dart code
@override Widget build(BuildContext context) { if (_isExisted) { return new Material( child: new Center( child: new Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ new Text('Barcode Reader'), new Input( labelText: 'Please input the image path', value: new InputValue(text: _filename), onChanged: onTextChanged, autofocus: true, ), new Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ new RaisedButton( child: new Text('Read'), onPressed: _getBarcode ), new RaisedButton( child: new Text('Reset'), onPressed: _resetResult ), ] ), new Image.file(new File(_filename)), new Text('$_result'), ] ) ) ); } else { return new Material( child: new Center( child: new Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ new Text('Barcode Reader'), new Input( labelText: 'Please input the image path', onChanged: onTextChanged, autofocus: true, ), new Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: <Widget>[ new RaisedButton( child: new Text('Read'), onPressed: _getBarcode ), new RaisedButton( child: new Text('Reset'), onPressed: _resetResult ), ] ), new Text('$_result'), ] ) ) ); } } Future<Null> _readBarcode() async { final Map<String, String> message = <String, String>{'filename':_filename}; final Map<String, dynamic> reply = await HostMessages.sendJSON('getBarcode', message); // If the widget was removed from the tree while the message was in flight, // we want to discard the reply rather than calling setState to update our // non-existent appearance. if (!mounted) return; setState(() { _result = reply['result'].toString(); }); }
Screenshot

So take a little bit of time and do it yourself :)
barcode_scanthis post mentions has been closed.barcode_scandependency is now discontinued.