【问题标题】:How can I receive data in Dart with onGenerateRoute bevor the build function runs?在构建函数运行之前,如何使用 onGenerateRoute 在 Dart 中接收数据?
【发布时间】: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);
      });
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的帮助。我找到了一个解决方案,并通过本地存储解决了这个问题。我为此实现了 shared_preferences 依赖项。
    • 太好了。我仍然很好奇您如何使用 shared_preferences 实现它。 shared_preferences 不也是一个Future函数需要等待吗?
    • 我在 http.get 函数前面用 await 调用了 getData 函数。我还编辑了我的代码,以便您可以看到确切的代码。
    • 从原始代码中,我看到一个问题,在void initState() 中使用`Future getInfo()` 是不安全的,因为initState 是同步函数并且不会等待Future功能完成。您可以尝试在getInfo() 中添加一些延迟,假装数据需要很长时间才能获取。我认为oid & webcode 在构建中使用时仍将保持为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多