【发布时间】:2021-01-26 15:25:43
【问题描述】:
在 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);
});
}
【问题讨论】: