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请求,更新futureCoinFutureBuilder会监听futureCoin的变化,自动重新构建UI显示对应货币的比特币价格
内容的提问来源于stack exchange,提问作者scarmose
相关产品推荐
相关产品推荐

