我目前正在与一个团队合作开展一个项目,在该团队中我实现了条形码扫描仪,该条形码扫描仪将成为“搜索”页面上的小部件。我目前面临的问题是,我使用条形码生成要包含在搜索中的成分列表,但是我不知道如何将这些信息返回到搜索页面。到目前为止,我已经尝试了两种方法:
我尝试创建扫描器类的成员变量,然后在需要时在搜索页面上访问它,但由于返回列表的函数是私有状态类的一部分,因此我不确定如何访问来自公共阶层。这是我想解决的方法。
我已经尝试过使用Navigator类从各个屏幕推送和弹出信息,但是问题是,一旦扫描了条形码,条形码扫描器就会自动关闭,因此我无法从堆栈中弹出,否则它将离开搜索页面,然后返回到之前的任何页面。
这是我的代码。第一个功能是打开条形码扫描仪,扫描条形码并创建我返回的成分清单的功能。我理想地将此“测试”列表设置为该类的公共部分而不是私有状态类的类成员。
Future<void> scanBarcodeNormal(BuildContext context) async {
String barcodeScanRes;
List<String> test;
// Platform messages may fail, so we use a try/catch PlatformException.
try {
barcodeScanRes = await FlutterBarcodeScanner.scanBarcode(
"#ff6666", "Cancel", true, ScanMode.BARCODE);
} on PlatformException {
barcodeScanRes = 'Failed to get platform version.';
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return null;
//Call the backend with the barcode to return the Bread Crumb list
List<String> breadCrumbs = await BackendRequest.barcode("089836187635", "42e96d88b6684215c9e260273b5e56b0522de18e");
//If the backend does not return us anything this displays a popup
if(breadCrumbs == null){
showDialog(
context: context,
builder: (BuildContext context) => CustomDialog(
title: "Uh Oh",
description:
"Barcode not found in our database, please try entering the item manually",
buttonText: "Okay",
),
);
}
else{
setState(() {
_scanBarcode = breadCrumbs.toString();
});
//Check the breadcrumbs for usable ingredients
test = await getIngredients(breadCrumbs, "42e96d88b6684215c9e260273b5e56b0522de18e");
}
setState(() {
_itemName = test[0].toString();
});
//Navigator.pop(context, test);
}
这里是我将小部件添加到搜索页面的位置。我要做的就是在我的扫描器类中添加小部件和build函数来处理onPressed()功能。
decoration: InputDecoration(
labelText: "Input an Ingredient",
hintText: "Search",
prefixIcon: Icon(Icons.search),
suffixIcon: ScanButton(),
您可以使用提供者使用模式,可以将所有页面放入一个父主题子级,然后可以访问变量和所有其他内容。
https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple
否则,您也可以使用块状图案
https://medium.com/flutterpub/architecting-your-flutter-project-bd04e144a8f1
或者如果您不希望在那种情况下使用它,可以创建一个通用类并在其中声明一个静态变量,并在扫描完成后根据结果设置变量,并在需要时使用