Flutter访问另一个dart文件中的变量



我有一个名为"BarcodePage.dart"的dart文件,它读取条形码,生成的数字存储为变量"barcodeResult"。我想在我的"testPage.dart"文件中引用这个变量,因为它将用于在API中搜索匹配的食物数据。

如何从BarcodePage文件调用barcodeResult变量并在testPage文件中使用它?我将把barcodeResult变量与baseURL变量&jsonEnd变量,以形成一个完整的http地址。使得最终的http地址将读作"http";https://world.openfoodfacts.org/api/v0/product/BARCODERESULT.json">

谢谢!

BarcodePage.dart文件:

class _BarcodePageState extends State<BarcodePage> {
String result= "Scan an item!";
Future _scanBarcode() async{
try{
ScanResult scanResult = await BarcodeScanner.scan();
String barcodeResult = scanResult.rawContent;
setState(() {
result = barcodeResult;
});

testPage.dart文件:

class _testPageState extends State<testPage> {
String baseURL= "https://world.openfoodfacts.org/api/v0/product/";
String jsonEnd = ".json";
String recipeURL= "";
List? listResponse;
Map? mapResponse;
List? listOfResults;
String? itemResult;
void join(){
setState(() {
recipeURL = baseURL + barcodeResult + jsonEnd ;
});
}
Future fetchData() async {
http.Response response;
response = await http 
.get(Uri.parse(recipeURL));
if (response.statusCode == 200) {
setState(() {
mapResponse = json.decode(response.body);
itemResult= mapResponse!['product']['product_name'].toString();
});
}
}

在不同屏幕之间共享变量值的两种可能性是:

  1. 在导航中将上一屏幕的值作为类似参数的传递到下一屏幕

    Navigator.push(
    context,
    MaterialPageRoute(
    builder: (context) => TestScreen(barcodeResult:barCodeResult),
    ),
    
    class TestScreen extends StatelessWidget {
    String? barCodeResult;
    TestScreen({this.barCodeResult});
    @override
    Widget build(BuildContext context) {
    return Container();
    }
    }
    

有关更多详细信息,请访问:https://docs.flutter.dev/cookbook/navigation/passing-data

  1. 或者您必须在其他类中全局声明变量,并使用Provider包更新和使用该变量

有关更多详细信息,请访问:https://pub.dev/packages/provider

我在写我的答案时假设你的应用程序中没有正确的状态管理,否则这甚至不是问题。

如果BarcodePage是第一个,TestPage是第二个,那么你可以使用@navidanchitrali的答案,但如果相反,我建议你使用Flutter的ValueChanged功能。

ValueChange所做的是,您可以在当前所在的下一个屏幕上更新上一个屏幕中的字符串变量。

这里,我们有一个barcodeResult变量,需要用扫描后在下一个屏幕中获得的值更新,所以这里是我建议的相同代码。

这是我们将值更改功能传递到条形码屏幕的测试页面

class TestPage extends StatefulWidget {
const TestPage({Key? key}) : super(key: key);
@override
State<TestPage> createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
String recipeUrl = "No recipe url detected";
String barcodeResult = "Scan an item!";
String baseUrl = "https://";
String jsonEnd = "/pizza";
void join() {
setState(() {
recipeUrl = baseUrl + barcodeResult + jsonEnd;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
width: MediaQuery.of(context).size.width,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(recipeUrl),
const SizedBox(height: 40),
ElevatedButton(
child: const Text("Scan Code"),
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (ctx) => BarcodePage(
result: (url) {
setState(() {
barcodeResult = url;
join();
});
},
),
),
);
},
)
],
),
),
);
}
}

这是条形码页面,我们有一个更新条形码结果变量值的功能。

class BarcodePage extends StatefulWidget {
BarcodePage({Key? key, required this.result}) : super(key: key);
ValueChanged<String> result;
@override
State<BarcodePage> createState() => _BarcodePageState();
}
class _BarcodePageState extends State<BarcodePage> {
Future _scanBarcode() async {
try {
// ScanResult scanResult = await BarcodeScanner.scan();
// String barcodeResult = scanResult.rawContent;
setState(() {
widget.result("barcodeResult");
});
} catch (e) {}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text("Scan Bar Code")),
body: Center(
child: ElevatedButton(
child: const Text("Scan Code"),
onPressed: () {
_scanBarcode();
},
)),
);
}
}

最新更新