You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何从双API获取股票列表与详情并展示?

股票详情页API调用与数据展示实现方案

1. 确认详情页接收参数

先确保StocksDetailScreen能正确接收列表页传递的股票代码和名称,通过构造函数传入:

class StocksDetailScreen extends StatelessWidget {
  final String stockCode;
  final String stockName;

  const StocksDetailScreen({
    super.key,
    required this.stockCode,
    required this.stockName,
  });

  @override
  Widget build(BuildContext context) {
    // 后续实现逻辑
  }
}

2. 封装详情API请求方法

先在pubspec.yaml中添加http依赖(http: ^1.1.0),然后编写请求工具方法:

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<BigParaDetay> fetchStockDetail(String stockCode) async {
  final url = Uri.parse('https://bigpara.hurriyet.com.tr/api/v1/borsa/hisseyuzeysel/$stockCode');
  final response = await http.get(url);

  if (response.statusCode == 200) {
    // 依赖BigParaDetay模型的fromJson方法解析JSON
    return BigParaDetay.fromJson(json.decode(response.body));
  } else {
    throw Exception('股票详情加载失败');
  }
}

注意:要确保BigParaDetay模型已实现fromJson构造函数,能正确映射API返回的JSON字段。

3. 用FutureBuilder处理异步状态

在详情页中使用FutureBuilder管理API请求的加载、成功、错误状态,对应展示不同UI:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text(stockName)),
    body: FutureBuilder<BigParaDetay>(
      future: fetchStockDetail(stockCode),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          // 加载中UI
          return const Center(child: CircularProgressIndicator());
        } else if (snapshot.hasError) {
          // 错误状态UI,可添加重试按钮
          return Center(child: Text('加载错误: ${snapshot.error}'));
        } else if (snapshot.hasData) {
          // 成功展示详情数据
          final detail = snapshot.data!;
          return Padding(
            padding: const EdgeInsets.all(16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text('股票代码: ${detail.code}', style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
                const SizedBox(height: 8),
                Text('当前价格: ${detail.currentPrice}'),
                Text('涨跌幅: ${detail.change} (${detail.changePercent}%)'),
                // 根据BigParaDetay模型的实际字段,继续添加其他详情内容
              ],
            ),
          );
        } else {
          return const Center(child: Text('无数据'));
        }
      },
    ),
  );
}

4. 可选优化

  • 引入状态管理工具(如Riverpod、Bloc),将网络请求逻辑从页面中剥离,避免页面重建重复请求;
  • 添加本地缓存,减少重复API调用;
  • 处理字段为空的边界情况,避免空指针异常;
  • 给错误状态添加重试按钮,提升用户体验。

内容的提问来源于stack exchange,提问作者Mıktad Tahir Durak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:36:22