如何解决颤振中“只能在初始值设定项中访问静态成员”?

Vic*_*tiz 3 android flutter

我正在开发一个 flutter 应用程序,我需要在其中扫描一些条形码,因此,为此,我使用了一个名为 barcode_scan ( https://pub.dartlang.org/packages/barcode_scan )的插件。因此,当我尝试从存储在步骤列表中的 RaisedButton 调用函数时,问题就出现了,因为我需要在 Stepper 小部件中显示该按钮,当我调用函数以在 onPressed、Android studio 上初始化条形码扫描仪时显示此消息“只能在初始化程序中访问静态成员”。

init条码扫描器的功能:

Future scan() async {
try {
  String barcode = await BarcodeScanner.scan();
  setState(() => this.barcode = barcode);
} on PlatformException catch (e) {
  if (e.code == BarcodeScanner.CameraAccessDenied) {
    setState(() {
      this.barcode = 'The user did not grant the camera permission!';
    });
  } else {
    setState(() => this.barcode = 'Unknown error: $e');
  }
} on FormatException{
  setState(() => this.barcode = 'null (User returned using the "back"-button before scanning anything. Result)');
} catch (e) {
  setState(() => this.barcode = 'Unknown error: $e');
}}
Run Code Online (Sandbox Code Playgroud)

以及步骤列表的代码

List<Step> mySteps = [
new Step(title: new Text("Scan first"),
    content: new Column(
      children: <Widget>[
        new Text("Code"),
        new Container(
          padding: EdgeInsets.only(top: 20),
          child: new Text("A08B",style: TextStyle(
              fontSize: 30,
              color: Colors.red
          ),
        )
        ,),
        new Container(
          child: new RaisedButton(onPressed: scan ,
          child: new Text("Scan"),),
        )
      ],
    ))];
Run Code Online (Sandbox Code Playgroud)

完整的飞镖课程:

void main() => runApp(MaterialApp(
        home: Ubicacion(),
    ));

class Ubicacion extends StatefulWidget {
@override
_UbicacionState createState() => _UbicacionState();}
class _UbicacionState extends State<Ubicacion> {

String barcode = "";
Future scan() async {
    try {
        String barcode = await BarcodeScanner.scan();
        setState(() => this.barcode = barcode);
    } on PlatformException catch (e) {
        if (e.code == BarcodeScanner.CameraAccessDenied) {
            setState(() {
                this.barcode = 'The user did not grant the camera permission!';
            });
        } else {
            setState(() => this.barcode = 'Unknown error: $e');
        }
    } on FormatException{
        setState(() => this.barcode = 'null (User returned using the "back"-button before scanning anything. Result)');
    } catch (e) {
        setState(() => this.barcode = 'Unknown error: $e');
    }
}


@override
Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
            title: Text('hello'),
        ),
        body: Container(
            padding: EdgeInsets.all(32.0),
            child: Center(
                child: Column(
                    children: <Widget>[

                        new Container(
                            child: new Stepper(steps: mySteps,
                            currentStep: this.pasoActual,
                            onStepContinue: (){
                                setState(() {
                                    if(pasoActual <mySteps.length -1){
                                        pasoActual++;
                                    }else{
                                        pasoActual = 0;
                                    }
                                });
                            },
                            onStepCancel: (){
                                setState(() {
                                    if(pasoActual >0){
                                        pasoActual--;
                                    }else{
                                        pasoActual = 0;
                                    }
                                });
                            },),
                        )


                    ],
                ),
            ),
        ),
    );
}

int pasoActual = 0;
List<Step> mySteps = [
    new Step(title: new Text("Escanear palet"),
            content: new Column(
                children: <Widget>[
                    new Text("Codigo"),
                    new Text("ID",),
                    new Text("PLU"),
                    new Container(
                        padding: EdgeInsets.only(top: 20),
                        child: new Text("A08B",style: TextStyle(
                                fontSize: 30,
                                color: Colors.red
                        ),
                        )
                        ,),
                    new Container(
                        child: new RaisedButton(onPressed: null ,
                            child: new Text("Escanear"),),
                    )
                ],
            ))
];
Run Code Online (Sandbox Code Playgroud)

}

Sid*_*kar 12

当您在类中声明非静态变量时尝试直接初始化它时,会发生上述错误。在您的情况下,我假设它是mySteps您直接初始化的列表。

initState()如果您Stateful Widget在类构造函数中使用或 ,请尝试在您的方法中初始化它,错误就会消失。

您还可以查看答案以获取有关同一问题的详细说明。