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

Flutter:点击列表项跳转页面并传递城市数据给FinalData类

Flutter 城市列表点击跳转传参并展示天气数据实现方案

1. 配置依赖

先在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.5
  http: ^1.1.0

执行flutter pub get完成依赖安装。


2. main.dart 实现城市列表与跳转传参

基于你的entries城市列表,用ListView.builder构建可点击列表,点击时传递城市参数跳转到目标页面:

import 'package:flutter/material.dart';
import 'show_met.dart';
import 'final_data.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    // 全局配置Provider,让子页面可访问FinalData实例
    return ChangeNotifierProvider(
      create: (context) => FinalData(),
      child: MaterialApp(
        title: '城市天气',
        home: const CityListPage(),
      ),
    );
  }
}

class CityListPage extends StatelessWidget {
  const CityListPage({super.key});
  
  // 示例城市列表,可替换为你的数据源
  final List<String> entries = ['北京', '上海', '广州', '深圳'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('选择城市')),
      body: ListView.builder(
        itemCount: entries.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(entries[index]),
            onTap: () {
              // 完成跳转+传递城市参数两个操作
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => ShowMetPage(city: entries[index]),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

3. 实现FinalData类(Provider数据模型)

创建final_data.dart,封装OpenWeatherMap API请求逻辑,通过Provider管理状态:

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

class FinalData extends ChangeNotifier {
  dynamic _weatherData;
  bool _isLoading = false;
  String? _errorMessage;

  // 对外暴露状态数据
  dynamic get weatherData => _weatherData;
  bool get isLoading => _isLoading;
  String? get errorMessage => _errorMessage;

  // 替换为你自己的OpenWeatherMap API Key
  final String apiKey = 'YOUR_API_KEY';

  Future<void> fetchWeather(String city) async {
    _isLoading = true;
    _errorMessage = null;
    notifyListeners();

    try {
      final response = await http.get(
        Uri.parse(
            'https://api.openweathermap.org/data/2.5/weather?q=$city&appid=$apiKey&units=metric&lang=zh_cn'),
      );

      if (response.statusCode == 200) {
        _weatherData = json.decode(response.body);
      } else {
        _errorMessage = '获取天气数据失败';
      }
    } catch (e) {
      _errorMessage = '网络请求错误';
      if (kDebugMode) {
        print(e);
      }
    } finally {
      _isLoading = false;
      notifyListeners();
    }
  }
}

4. show_met.dart 用FutureBuilder+Provider展示天气

在目标页面中,通过Provider获取FinalData实例,结合FutureBuilder处理异步请求并展示数据:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'final_data.dart';

class ShowMetPage extends StatelessWidget {
  final String city;
  const ShowMetPage({super.key, required this.city});

  @override
  Widget build(BuildContext context) {
    final finalData = Provider.of<FinalData>(context, listen: false);
    
    return Scaffold(
      appBar: AppBar(title: Text('$city 天气')),
      body: FutureBuilder(
        future: finalData.fetchWeather(city),
        builder: (context, snapshot) {
          // 加载中状态
          if (finalData.isLoading) {
            return const Center(child: CircularProgressIndicator());
          }
          // 错误状态
          if (finalData.errorMessage != null) {
            return Center(child: Text(finalData.errorMessage!));
          }
          // 数据加载成功状态
          if (finalData.weatherData != null) {
            return Padding(
              padding: const EdgeInsets.all(16.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text(
                    '城市: ${finalData.weatherData['name']}',
                    style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
                  ),
                  const SizedBox(height: 16),
                  Text('温度: ${finalData.weatherData['main']['temp']}°C'),
                  Text('体感温度: ${finalData.weatherData['main']['feels_like']}°C'),
                  Text('天气状况: ${finalData.weatherData['weather'][0]['description']}'),
                  Text('湿度: ${finalData.weatherData['main']['humidity']}%'),
                ],
              ),
            );
          }
          // 默认空状态
          return const Center(child: Text('暂无数据'));
        },
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者GEEK MEHDI SA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:45:36