我正在尝试学习在 Flutter 中进行 api 调用,并制作一个至少对我有用的应用程序!
为此,我正在调用 Nifty 的(印度证券交易所)API:https ://www.nseindia.com/api/option-chain-indices?symbol=NIFTY
我正在使用以下代码来实现我的目标
import 'dart:convert';
import 'package:http/http.dart';
final url = 'https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY';
Future<Map<String, dynamic>> fetchNiftyData() async {
final response = await get(
Uri.parse(url),
);
Map<String, dynamic> responseBody = jsonDecode(response.body);
return responseBody;
}
有用。它按原样从api返回数据!
但有时不是。在重新启动应用程序时,它可能会再次运行,也可能无法运行。我不希望我的应用程序在调用 api 时如此不一致。
这是我得到的错误堆栈:
Restarted application in 3,418ms.
E/flutter ( 3901): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FormatException: Unexpected character (at character 1)
E/flutter ( 3901): <!DOCTYPE html>
E/flutter ( 3901): ^
E/flutter ( 3901):
E/flutter ( 3901): #0 _ChunkedJsonParser.fail (dart:convert-patch/convert_patch.dart:1404:5)
E/flutter ( 3901): #1 _ChunkedJsonParser.parseNumber (dart:convert-patch/convert_patch.dart:1271:9)
E/flutter ( 3901): #2 _ChunkedJsonParser.parse (dart:convert-patch/convert_patch.dart:936:22)
E/flutter ( 3901): #3 _parseJson (dart:convert-patch/convert_patch.dart:40:10)
E/flutter ( 3901): #4 JsonDecoder.convert (dart:convert/json.dart:506:36)
E/flutter ( 3901): #5 JsonCodec.decode (dart:convert/json.dart:157:41)
E/flutter ( 3901): #6 jsonDecode (dart:convert/json.dart:96:10)
E/flutter ( 3901): #7 fetchBankNiftyData
package:options_trader/Services/fetch_bank_nifty_data.dart:12
E/flutter ( 3901): <asynchronous suspension>
E/flutter ( 3901): #8 _BankNiftyScreenState.getBankNiftyData
package:options_trader/Screens/bank_nifty_screen.dart:21
E/flutter ( 3901): <asynchronous suspension>
E/flutter ( 3901):
最后,这就是我调用/使用获取的数据的方式......
import 'package:flutter/material.dart';
import '../Services/fetch_nifty_data.dart';
class NiftyScreen extends StatefulWidget {
@override
_NiftyScreenState createState() => _NiftyScreenState();
}
class _NiftyScreenState extends State<NiftyScreen> {
Map<String, dynamic>? niftyDetails = {};
@override
void initState() {
super.initState();
getNiftyDetails();
}
getNiftyDetails() async {
this.niftyDetails = await fetchNiftyData();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: niftyDetails!.isNotEmpty
? ListView.builder(
itemCount: niftyDetails!["filtered"]["data"].length,
itemBuilder: (_, index) {
return ListTile(
title: Text(
'${niftyDetails!["filtered"]["data"][index]["strikePrice"]}'),
);
},
)
: LinearProgressIndicator(),
);
}
}
我究竟做错了什么?最佳做法是什么?TIA