Как разрешить «Только статические члены могут быть доступны в инициализаторах» во флаттере?

Я разрабатываю флаттер-приложение, в котором мне нужно сканировать некоторые штрих-коды, поэтому для этого я использую плагин под названием barcode_scan (https://pub.dartlang.org/packages/barcode_scan). Итак, проблема возникает, когда я пытаюсь вызвать функцию из RaisedButton, которая хранится в списке шагов, потому что мне нужно показать эту кнопку внутри виджета Stepper, когда я вызываю функцию для инициализации сканера штрих-кода в студии onPressed, Android. показать это сообщение «в инициализаторах можно получить доступ только к статическим членам».

Функция для инициализации сканера штрих-кода:

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');
}}

И код для списка шагов

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"),),
        )
      ],
    ))];

Полный дартс класс:

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"),),
                    )
                ],
            ))
];

}

Можете ли вы показать структуру класса? Это может быть полезно.

KeroppiMomo 10.04.2019 16:51

Кроме того, что такое Step? Это пользовательский виджет, который вы сделали? Можете ли вы показать нам его код?

KeroppiMomo 10.04.2019 16:55

Для точности Проверьте этот ответ: stackoverflow.com/a/63165959/10563627

Paresh Mangukiya 30.07.2020 05:57
3
3
6 667
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вышеупомянутая ошибка возникает, когда вы пытаетесь инициализировать нестатическую переменную непосредственно при ее объявлении внутри класса. В вашем случае я предполагаю, что это список mySteps, который вы инициализируете напрямую.

Попробуйте инициализировать его внутри вашего метода initState(), если вы используете Stateful Widgetили внутри конструктора класса, и ошибка исчезнет.

Вы также можете проверить ответ это для подробного объяснения той же проблемы.

Я сделал то, что вы предложили, и это сработало! Спасибо :)

Victor Ortiz 10.04.2019 17:49

Здорово! Рад, что смог помочь!

thedarthcoder 10.04.2019 17:54

Другие вопросы по теме