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

Flutter HTTP请求:如何根据下拉选择动态更新工厂构造器货币字段

解决Flutter动态切换货币获取比特币价格的问题

核心问题在于你当前的Coin.fromJson工厂构造器硬编码了USD,无法动态接收选中的货币参数;同时页面里的FutureBuilder没有随着下拉选择更新请求,导致价格不刷新。以下是具体修改方案:

1. 让Coin.fromJson支持动态货币参数

修改coin_data.dart中的Coin类,给工厂构造器添加currency参数,用它替代硬编码的USD:

class Coin {
  final double price;

  const Coin({
    required this.price,
  });

  // 添加currency参数,动态获取对应货币的价格
  factory Coin.fromJson(Map<String, dynamic> json, String currency) {
    return Coin(
      price: json['RAW']['BTC'][currency]['PRICE'],
    );
  }
}

2. 更新fetchCoin方法传递货币参数

修改CoinData的fetchCoin方法,将选中的货币传给fromJson:

class CoinData {
  Future<Coin> fetchCoin(String selectedCurrency) async {
    final response =
        await http.get(Uri.parse('$coinDataURL$selectedCurrency&$apiKey'));

    if (response.statusCode == 200) {
      // 传入selectedCurrency给fromJson
      return Coin.fromJson(jsonDecode(response.body), selectedCurrency);
    } else {
      throw Exception('Failed to load coin data');
    }
  }
}

3. 修复PriceScreen中的FutureBuilder更新问题

当前futureCoin只在initState初始化一次,下拉选择后不会重新请求。需要把futureCoin改为状态变量,在getData中更新:

class _PriceScreenState extends State<PriceScreen> {
  String selectedCurrency = "USD";
  // 把futureCoin设为状态变量,初始化为初始请求
  Future<Coin>? futureCoin;

  @override
  void initState() {
    super.initState();
    futureCoin = CoinData().fetchCoin(selectedCurrency);
  }

  void getData() async {
    setState(() {
      // 更新futureCoin为新的请求
      futureCoin = CoinData().fetchCoin(selectedCurrency);
    });
  }

  // ... 其他代码不变
}

4. 完善iOS选择器的回调逻辑

当前iOS的CupertinoPicker没有处理选择事件,添加逻辑更新选中货币并触发请求:

CupertinoPicker iOSPicker() {
  List<Text> pickerItems = [];
  for (String currency in currenciesList) {
    pickerItems.add(Text(currency));
  }

  return CupertinoPicker(
    backgroundColor: Colors.lightBlue,
    itemExtent: 32.0,
    onSelectedItemChanged: (selectedIndex) {
      setState(() {
        selectedCurrency = currenciesList[selectedIndex];
        getData();
      });
    },
    children: pickerItems,
  );
}

验证修改

做完以上修改后,下拉选择不同货币时:

  • 会触发setState更新selectedCurrency
  • getData会重新发起HTTP请求,更新futureCoin
  • FutureBuilder会监听futureCoin的变化,自动重新构建UI显示对应货币的比特币价格

内容的提问来源于stack exchange,提问作者scarmose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:10:02