Elias Andualem

fix: Handle all cases when a controller should be initialized and disposed

@@ -26,9 +26,12 @@ class MobileScanner extends StatefulWidget { @@ -26,9 +26,12 @@ class MobileScanner extends StatefulWidget {
26 final BoxFit fit; 26 final BoxFit fit;
27 27
28 /// Create a [MobileScanner] with a [controller], the [controller] must has been initialized. 28 /// Create a [MobileScanner] with a [controller], the [controller] must has been initialized.
29 - const MobileScanner(  
30 - {Key? key, this.onDetect, this.controller, this.fit = BoxFit.cover})  
31 - : assert((controller != null)), 29 + const MobileScanner({
  30 + Key? key,
  31 + this.onDetect,
  32 + this.controller,
  33 + this.fit = BoxFit.cover,
  34 + }) : assert((controller != null)),
32 super(key: key); 35 super(key: key);
33 36
34 @override 37 @override
@@ -43,11 +46,7 @@ class _MobileScannerState extends State<MobileScanner> @@ -43,11 +46,7 @@ class _MobileScannerState extends State<MobileScanner>
43 @override 46 @override
44 void initState() { 47 void initState() {
45 super.initState(); 48 super.initState();
46 - if (widget.controller == null) {  
47 - controller = MobileScannerController();  
48 - } else {  
49 - controller = widget.controller!;  
50 - } 49 + controller = widget.controller ?? MobileScannerController();
51 } 50 }
52 51
53 @override 52 @override
@@ -97,8 +96,25 @@ class _MobileScannerState extends State<MobileScanner> @@ -97,8 +96,25 @@ class _MobileScannerState extends State<MobileScanner>
97 } 96 }
98 97
99 @override 98 @override
  99 + void didUpdateWidget(covariant MobileScanner oldWidget) {
  100 + super.didUpdateWidget(oldWidget);
  101 + if (oldWidget.controller == null) {
  102 + if (widget.controller != null) {
  103 + controller.dispose();
  104 + controller = widget.controller!;
  105 + }
  106 + } else {
  107 + if (widget.controller == null) {
  108 + controller = MobileScannerController();
  109 + } else if (oldWidget.controller != widget.controller) {
  110 + controller = widget.controller!;
  111 + }
  112 + }
  113 + }
  114 +
  115 + @override
100 void dispose() { 116 void dispose() {
101 - controller.dispose(); 117 + if (widget.controller == null) controller.dispose();
102 super.dispose(); 118 super.dispose();
103 } 119 }
104 } 120 }