gpt4 book ai didi

json - 将json数据发送到新屏幕Flutter

转载 作者:行者123 更新时间:2023-12-03 03:29:41 25 4
gpt4 key购买 nike

我想将json对象发送到新的dart文件并在其中使用它。
在第一个文件中是一个列表 View ,当您点击列表项时,将调用secondscreen(jobdetail),并通过该调用将所有json信息发送到secondscreen(jobdetail)并将其打印到控制台中。
如果您有其他更好的方法,则不必纠正我的方法。
这是我尝试的方式:
第一个画面:

onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => JobDetail(),
// Pass the arguments as part of the RouteSettings. The
// DetailScreen reads the arguments from these settings.
settings: RouteSettings(
arguments: jsonData[index],
),
),
);
},
第二屏(jobdetail):
class JobDetail extends StatelessWidget {

@override
Widget build(BuildContext context) {
final jsonData = ModalRoute.of(context).settings.arguments;
print(jsonData.titel);
return new MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Flutter App with MYSQL',
home: new MyHomePage(),

);
}
}

Future<dynamic> senddata() async {
final response = await http.post(
"https://www.quyre.de/2/JobBlock.N.php", body: {
"status": "0",
"Id": "5",
"JobBlocksInProres": "0",
"IdJB": jsonData.titel,
});

var datauser = json.decode(response.body);

String jsonsDataString = datauser.toString();
dynamic Data = jsonDecode(jsonsDataString);

print(Data);


return Data;
}
我收到此错误:
lib/JobDetail.dart:15:20: Error: The getter 'titel' isn't defined for the class 'Object'.
- 'Object' is from 'dart:core'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'titel'.
print(jsonData.titel);
^^^^^
lib/JobDetail.dart:31:13: Error: Getter not found: 'jsonData'.
"IdJB": jsonData.id,
^^^^^^^^
lib/JobDetail.dart:37:11: Error: Can't declare 'jsonData' because it was already used in this scope.
dynamic jsonData = jsonDecode(jsonsDataString);
^^^^^^^^
lib/JobDetail.dart:31:13: Context: Previous use of 'jsonData'.
"IdJB": jsonData.id,
^^^^^^^^
lib/JobDetail.dart:39:9: Error: Getter not found: 'jsonData'.
print(jsonData);
^^^^^^^^
lib/JobDetail.dart:42:10: Error: Getter not found: 'jsonData'.
return jsonData;
谢谢你的回答
新代码
第一个画面:
onTap: () {
JobDetailScreenArg arg = JobDetailScreenArg(jsonData);
Navigator.of(context).pushNamed('/JobDetailScreen', arguments: arg);
},
其余的也在文件中
第二屏:
  import 'package:flutter/material.dart';

import 'package:navigation/Muensterboerse.dart';

class JobDetailScreen extends StatefulWidget {
final Job job;

JobDetailScreen(this.job);

@override
_JobDetailScreenState createState() => _JobDetailScreenState();
}

class _JobDetailScreenState extends State<JobDetailScreen> {
@override
Widget build(BuildContext context) {
return Container(
child: Text('${job.title}'),
);
}
}

最佳答案

首先,请检查以下内容:

  • 在第一个屏幕上,我觉得jsonData被解码为dynamic类型。如果您的jsonString是有效的JSON,请将其解码为Map<String, dynamic>。例如Map<String, dynamic> data = jsonDecode(jsonString)。注意FormatException & TypeError
  • 另外,如果您的jsonString包含项列表(作业json对象),则按如下所示转换列表并将其项映射到您自己的Dart对象中。
  • var items = data['jobs'] as List;
    List<Job> jobs = items.map<Job>((jobItem) => Job.fromJSON(jobItem)).toList();
  • 您的Job Dart对象可能如下所示
  • class Job {
    final String title;
    // Other properties

    Job({this.title});

    factory Job.fromJSON(Map<String, dynamic> map) {
    return Job(
    title: map['title'],
    );
    }
    }
    接下来,我建议使用下面的代码片段作为从途中向另一个发送数据的好方法。
  • 首选命名路线
    About named routes

  • 为您的路由参数数据创建参数类
    class JobDetailScreenArg {
    final Job job;

    JobDetailScreenArg(this.job);
    }
    MaterialApp(
    title: 'Jobs',
    // Start the app with the "/" named route. In this case, the app starts
    // on the FirstScreen widget.
    initialRoute: '/',
    onGenerateRoute: (RouteSettings settings) {
    switch(settings.name) {
    case '/jobDetail':
    JobDetailScreenArg args = settings.arguments;
    return _buildRoute(settings, JobDetailScreen(args.job));
    case '/':
    return _buildRoute(settings, JobsScreen());
    }
    }
    )



    Route _buildRoute(RouteSettings settings, Widget screen) {
    return MaterialPageRoute(
    settings: settings,
    builder: (context) => screen,
    );
    }
    职位列表屏幕
    onTap: () {
    // job - tapped item
    JobDetailScreenArg arg = JobDetailScreenArg(job);
    Navigator.of(context).pushNamed('/jobDetail', arguments: arg);
    }
    详细信息屏幕
    class JobDetailScreen extends StatefulWidget {
    final Job job;

    JobDetailScreen(this.job);

    @override
    _JobDetailScreenState createState() => _JobDetailScreenState();
    }

    class _JobDetailScreenState extends State<JobDetailScreen> {
    @override
    Widget build(BuildContext context) {
    return Container(
    child: Text('${job.title}'),
    );
    }
    }

    关于json - 将json数据发送到新屏幕Flutter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64769280/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com