我如何将信息从小部件功能返回到另一个页面?

问题描述 投票:0回答:1

我目前正在与一个团队合作开展一个项目,在该团队中我实现了条形码扫描仪,该条形码扫描仪将成为“搜索”页面上的小部件。我目前面临的问题是,我使用条形码生成要包含在搜索中的成分列表,但是我不知道如何将这些信息返回到搜索页面。到目前为止,我已经尝试了两种方法:

  1. 我尝试创建扫描器类的成员变量,然后在需要时在搜索页面上访问它,但由于返回列表的函数是私有状态类的一部分,因此我不确定如何访问来自公共阶层。这是我想解决的方法。

  2. 我已经尝试过使用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(),
flutter dart
1个回答
0
投票

您可以使用提供者使用模式,可以将所有页面放入一个父主题子级,然后可以访问变量和所有其他内容。

https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple

否则,您也可以使用块状图案

https://medium.com/flutterpub/architecting-your-flutter-project-bd04e144a8f1

或者如果您不希望在那种情况下使用它,可以创建一个通用类并在其中声明一个静态变量,并在扫描完成后根据结果设置变量,并在需要时使用

© www.soinside.com 2019 - 2024. All rights reserved.