将数据传递给一个类,同时打开另一个屏幕FLUTTER



点击我想打开show_data((作为屏幕,并在同一时间将entries[index]作为城市发送到FinalData((,

条目是城市的列表

main.dart

final List<String> entries = <String>[
'Casablanca',
'Agadir',
'Marrakech',
'Tanger'
];
final List<String> City = <String>[
'assets/images/casablanca.png',
'assets/images/Agadir.PNG',
'assets/images/marrakech.PNG',
'assets/images/Tanger.PNG'
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: const Text('Meteo Maroc'),
),
body: Center(
child: ListView.separated(
addAutomaticKeepAlives: true,
padding: const EdgeInsets.all(8),
itemCount: entries.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(

onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
const show_data(),

),

),

child: Container(
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(15)),
color: Colors.blueGrey,
),
height: 400,
// child: Center(child: Text('Entry ${entries[index]}')),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Image.asset(City[index]),
Text(
entries[index],
textAlign: TextAlign.center,
style: const TextStyle(
height: 2,
fontSize: 26,
color: Colors.white,
fontWeight: FontWeight.bold),
),

我想在FinalData.dart中接收main.dart作为城市的条目[index],以了解这个城市的天气。

FinalData.dart

class FinalData with ChangeNotifier{
String city;
FinalData({required this.city});

List <Met_data> MetData=[];
Future<List<Met_data>?> getDataMet() async {
var url = Uri.https('api.openweathermap.org', '/data/2.5/weather',
{'q': city, 'units': 'metric', 'appid': apiKey});
var response = await http.get(url);
if (response.statusCode == 200) {
var jsonResponse =
convert.jsonDecode(response.body) as Map<String, dynamic>;

MetData.add(Met_data.fromJson(jsonResponse));

return MetData;
} else {
print(response.statusCode);
}

return null;
// ignore: dead_code
notifyListeners();

}

并在show_met.dart 中显示天气

show_met.dart

body: FutureBuilder(
future: Provider.of<FinalData>(context).getDataMet(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (snapshot.data != null) // check for null
{
List<Met_data>? data = snapshot.data as List<Met_data>;
if (snapshot.hasError) {
return const Text('Error');
}
if (snapshot.data != Null) {
return ListView.builder(
itemCount: 1,
itemBuilder: (context, index) {
return Center(
child: Text(
data[index].temp.toString(),
style: const TextStyle(
color: Colors.blueAccent,
fontSize: 36,
),
),
);
},
);
} 
}
return const Center(child: Text('Load ok'),);
}

),

首先你需要通过这样的城市:

onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
const show_met(entries[index]),

),

),

然后更改您的show_met.dart以接受该城市:

class show_met extends StatefulWidget {
const show_met({Key? key, required this.city}) : super(key: key);
final String city;
@override
State<show_met> createState() => _show_metState();
}

然后在FinalData:中更改您的getDataMet

Future<List<Met_data>?> getDataMet(String city) async {
var url = Uri.https('api.openweathermap.org', '/data/2.5/weather',
{'q': city, 'units': 'metric', 'appid': apiKey});
var response = await http.get(url);
if (response.statusCode == 200) {
var jsonResponse =
convert.jsonDecode(response.body) as Map<String, dynamic>;

MetData.add(Met_data.fromJson(jsonResponse));

return MetData;
} else {
print(response.statusCode);
}

return null;
// ignore: dead_code
notifyListeners();

}

然后将city传递给show_met类中的getDataMet:

body: FutureBuilder(
future: Provider.of<FinalData>(context).getDataMet(widget.city),
builder: (context, snapshot) {
...
}
)

最新更新