flutter - 在构建函数运行之前,如何使用 onGenerateRoute 在 Dart 中接收数据?
问题描述
在 Dart 中,我想使用 onGenerateRoute 将数据从“/city”发送到“/card”。
class RoutGenerator {
static Route<dynamic> generateRoute (RouteSettings settings) {
final args = settings.arguments;
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (context) => Home());
case '/city':
return MaterialPageRoute(
builder: (context) => City());
case '/card':
return MaterialPageRoute(
builder: (context) => Cardd());
}
}
}
我要发送的数据来自带有地图列表的 JSON(例如:{(oid: 1, webcode: TSGBF, name: Berlin), (oid: 2, webcode: HSJAT, name: London), .. .}. 我为每张地图和 onTap 构建了一张卡片,我想将 oid 和 webcode 发送到 '/card' :
String oid;
String webcode;
CityState({this.oid, this.webcode});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Städte"), backgroundColor: Colors.blue),
body: ListView.builder(
itemCount: data == null ? 0 : data.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
oid = (data[index]["oid"]);
webcode = (data[index]["webcode"]);
Navigator.pushNamed(context, '/loadcard', arguments: {
'oid': oid, 'webcode': webcode
});
},
...
问题来了。oid 和 webcode 是我需要的“/card”页面的 URL 的一部分。如何从第一页获取两个字符串并将它们实现到 URL 中,以便在构建函数运行之前加载正确的页面?
class Cardd extends StatefulWidget {
@override
CarddState createState() => CarddState();
}
class CarddState extends State<Cardd> {
List info;
Future<void> getInfo() async {
var antwort = await http.get('http://www. ... webcode=$webcode&ort_id=$oid ...');
this.setState(() {
info = jsonDecode(antwort.body);
});
}
@override
void initState() {
super.initState();
this.getInfo();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
...
*编辑
我导入了包“shared_preferences”并使用以下代码将我的数据保存在本地存储中:
void saveData(oid, webcode) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('oid', oid);
prefs.setString('webcode', webcode);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Städte"), backgroundColor: Colors.blue),
body: //(data != null) ?
ListView.builder(
itemCount: data == null ? 0 : data.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
saveData(data[index]["oid"], data[index]["webcode"]);
Navigator.pushNamed(context, '/toilet');
},
...
之后,我可以在另一页上收到它:
String oid;
String webcode;
Future<void> loadData() async{
SharedPreferences prefs = await SharedPreferences.getInstance();
oid = prefs.getString('oid');
webcode = prefs.getString('webcode');
}
List info;
Future<void> getInfo() async {
await this.loadData();
var antwort = await http.get(
'http://www. ... $webcode&ort_id=$oid ... ');
this.setState(() {
info = jsonDecode(antwort.body);
});
}
解决方案
显然,在构建小部件之前,您需要 Future 中的一些东西。也许您正在寻找FutureBuilder
:https ://api.flutter.dev/flutter/widgets/FutureBuilder-class.html
当数据尚未准备好(加载页面)时,您还需要添加一些其他小部件。
推荐阅读
- android - Prevent LaunchedEffect from re-running on configuration change
- r - Taking a set of values with a equal or similar mean in R
- javascript - React use a form in a modal to pass the inputted data to a function
- javascript - 如何在 create-react-app 中禁用“X-Powered-By”响应标头?
- java - Get indices of unique WebElements.getText() objects in an ArrayList
- cognos - Cognos Analytics:按月将变量拆分为两个
- raspberry-pi - 在我的 Mac 上为我的 Raspberry Pi 4 创建一个快捷方式
- javascript - 如何在php函数中传递javascript变量
- swiftui - 隐藏点籼稻
- laravel - 在 laravel 的注册页面中检索数据库值