未定义函数 setState

The function setState is not defined

我正在尝试在我的移动应用程序中制作条形码扫描器。我制作了一个名为 barcode_scanner.dart 的文件和一个名为 barcode_scanner_bloc.dart 的文件。我正在尝试在 barcode_scanner_bloc.dart 中编写 scan() 方法并从 barcode_scanner.dart 中调用它。 为此,我这样做了:

import 'dart:async';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:flutter/material.dart';

import 'barcode_scanner_bloc.dart';

class ScanBarcode extends StatefulWidget {
  @override
  _ScanBarcodeState createState() => _ScanBarcodeState();

  static scan() {}
}

class _ScanBarcodeState extends State<ScanBarcode> {
  String barcode = "";
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: new Text('Code Scanner'),
        centerTitle: true,
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            Padding(
              padding: EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
              child: RaisedButton(
                color: Colors.purple,
                textColor: Colors.white,
                splashColor: Colors.blueGrey,
                onPressed: scan,
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Icon(Icons.scanner, size: 40),
                    SizedBox(width: 10),
                    Column(
                      children: <Widget>[
                        Text('Camera Scan'),
                        SizedBox(
                          height: 2,
                        ),
                        Text('Click here')
                      ],
                    )
                  ],
                ),
              ),
            ),
            Padding(
              padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
              child: Text(
                barcode,
                textAlign: TextAlign.center,
              ),
            )
            
          ],
          
        ),
      ),
    );
  }
}

现在我正在尝试添加 scan() 方法,但是当我尝试在另一个文件中这样做时,它给出了错误。这是我的代码:

import 'dart:async';
import 'package:barcode_scan/barcode_scan.dart';
import 'package:flutter/material.dart';

import 'barcode_scanner.dart';




Future scan() async {
  try {
    String barcode = await ScanBarcode.scan();
    setState(() {
      this.barcode = barcode;
    });
  } on PlatformException catch (e) {
    if (e.code == ScanBarcode.CameraAccessDenied) {
      setState(() {
        this.barcode = 'camera permission not granted';
      });
    } else {
      setState(() {
        this.barcode = 'Unknown error: $e';
      });
    }
  } on FormatException {
    setState(() {
      this.barcode = 'null (user returned using the back button)';
    });
  } catch (e) {
    setState(() {
      this.barcode = 'Unknown error: $e';
    });
  }
}

如果有人能帮助我,我会很高兴。

我认为您要么需要设置通知和侦听器模式,要么需要使用流控制器设置流。我个人使用 flutter_bloc 包来执行此操作(在 youtube 上每个都有完整的 flutter 教程)。使用 flutter_bloc,您可以像这样从您的小部件调用 scan():

bloc.add(ScanEventStart());

基本上你向 BLoC 发送一个事件,它 returns 状态到你的小部件的 BlocBuilder 小部件。

您无法从 StatefulWidget

外部访问 setState

尝试在 StatefulWidget class

中使用 scan() 函数

或尝试使 scan() 函数 return 成为 barcode 的值,然后调用 setState

所以它会像

Future<String> scan() async {
  try {
    String barcode = await ScanBarcode.scan();
    return barcode;
  } on PlatformException catch (e) {
    if (e.code == ScanBarcode.CameraAccessDenied) {
        return 'camera permission not granted';
    } else {
       return 'Unknown error: $e';
    }
  } on FormatException {
    return  'null (user returned using the back button)';
  } catch (e) {
     return  'Unknown error: $e';
  }
}

在你的 ScanBarcode class

onPressed: () async {
setState(() {
        this.barcode = await scan();
      });
},

谢谢你们!如果你能回答我还有一个问题,在这个 if (e.code == ScanBarcode.CameraAccessDenied) 部分它给出了错误 'The getter CameraAccessDenied 没有为 ScanBarcode 类型定义,我应该如何集成它?我是编码和 flutter 的新手,所以我不知道这些类型的东西。