首页 > 解决方案 > 在构建函数运行之前,如何使用 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);
      });
  }

标签: flutterdart

解决方案


显然,在构建小部件之前,您需要 Future 中的一些东西。也许您正在寻找FutureBuilderhttps ://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

当数据尚未准备好(加载页面)时,您还需要添加一些其他小部件。


推荐阅读