Я разрабатываю флаттер-приложение, в котором мне нужно сканировать некоторые штрих-коды, поэтому для этого я использую плагин под названием 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"),),
)
],
))
];
}
Кроме того, что такое Step
? Это пользовательский виджет, который вы сделали? Можете ли вы показать нам его код?
Для точности Проверьте этот ответ: stackoverflow.com/a/63165959/10563627
Вышеупомянутая ошибка возникает, когда вы пытаетесь инициализировать нестатическую переменную непосредственно при ее объявлении внутри класса.
В вашем случае я предполагаю, что это список mySteps
, который вы инициализируете напрямую.
Попробуйте инициализировать его внутри вашего метода initState()
, если вы используете Stateful Widget
или внутри конструктора класса, и ошибка исчезнет.
Вы также можете проверить ответ это для подробного объяснения той же проблемы.
Я сделал то, что вы предложили, и это сработало! Спасибо :)
Здорово! Рад, что смог помочь!
Можете ли вы показать структуру класса? Это может быть полезно.