我把主函数里面的API接口函数,转移在另一个dart文件,然后在主函数导入它,方便维护代码,但是很快就发现了问题
下面是API接口函数以及测试处理
import 'dart:convert';
import 'package:http/http.dart' as http;
import './tiantianjijin/tiantianjijn_jtod.dart';
tiantianjijin(Tiantianjijin? t) async{
var headers = {
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Cookie': 'st_si=23513143112904; st_asi=delete; st_pvi=75677265749136; st_sp=2022-08-30%2014%3A49%3A55; st_inirUrl=https%3A%2F%2Fwww.nowcoder.com%2F; st_sn=4; st_psi=20230303151428570-112200312935-2690096899',
'Proxy-Connection': 'keep-alive',
'Referer': 'http://fund.eastmoney.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57',
'Accept-Encoding': 'gzip',
};
http://api.fund.eastmoney.com/FundGuZhi/GetFundGZList?type=1&sort=3&orderType=desc&canbuy=1&pageIndex=1&pageSize=200&callback=jQuery1830052794852709326934_1677850528473&_=1677850531737
var url = Uri.parse('http://api.fund.eastmoney.com/FundGuZhi/GetFundGZList?type=1&sort=3&orderType=desc&canbuy=1&pageIndex=1&pageSize=200');
var res = await http.get(url, headers: headers);
if (res.statusCode != 200) throw Exception('http.get error: statusCode= ${res.statusCode}');
Tiantianjijin t = Tiantianjijin.fromJson(jsonDecode(res.body));
for (var element in t!.data!.list!) { print("${element.bzdm}");}
}
这是主函数部分代码
class home extends StatefulWidget {
@override
State createState() => _homeState();
}
class _homeState extends State {
late String aa;
late Tiantianjijin? t=null;
@override
void initState(){
super.initState();
// xueqiu();
tiantianjijin(t);
}
结果报错,好像是说t变量没有初始化,我是打算把t变量扔给API接口函数处理并给它赋值。这个报错的原因是先后顺序不一样吗还是
LateInitializationError: Field 't' has not been initialized.
“Devil组”引证GPT后的撰写:
具体地,可以这样修改代码:
class _homeState extends State<home> {
late String aa;
Tiantianjijin? t;
@override
void initState(){
super.initState();
t = Tiantianjijin(); // 或者根据需要初始化为其他值
tiantianjijin(t);
}
...
}
在 _homeState 类中定义了一个名为 t 的变量,并在 initState 方法中初始化它。然后,在调用 tiantianjijin 函数时,您可以将这个变量传递给它。
运行你的代码运行没有问题,如果你的环境运行报错,建议:升级flutter sdk到最新版本,升级 flutter插件和dart插件到最新版本。
运行之外,逻辑上有问题:
1、你上述代码主函数中定义的 t 不会被初始化并赋值,所以会在后续的使用中报错,你可以通过断点调试验证这一点。
2、不同于c++的指针,不要使用传递参数的方法获得处理结果,而是使用子函数返回值来代替(而且你在子函数中第18行重新定义了新的变量t,即使是c++环境下,也无法获得期望的结果)。你用于 json 返回值处理的 dart 子函数无返回值,建议改用
Future <Tiantianjijin?> tiantianjijin() async{
...
return t;
}
返回给主函数。
在主函数中调用子函数方法:Tiantianjijin? t = await tiantianjijin();