未定义函数 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 的新手,所以我不知道这些类型的东西。
我正在尝试在我的移动应用程序中制作条形码扫描器。我制作了一个名为 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 的新手,所以我不知道这些类型的东西。