![](/img/trans.png)
[英]Flutter. type 'Null' is not a subtype of type 'String' in type cast
[英]type 'Null' is not a subtype of type 'String' error in Flutter
问题:我正在构建一个世界时间应用程序,我收到一个错误,类型“Null”不是“String”类型的子类型。我正在使用变量 isdaytime 根据国家/地区的时间更改应用程序中的背景图像,在白天,背景图像将是白天,而在晚上,背景图像将是夜晚。 但似乎字符串在某处得到 Null。 请帮助我解决疑问
主要.dart
import 'package:flutter/material.dart';
import 'package:universal_time_app/pages/choose_location.dart';
import'package:universal_time_app/pages/home.dart';
import'package:universal_time_app/pages/loading.dart';
void main() => runApp(MaterialApp(
initialRoute: '/home',
routes: {
'/':(context)=>Loading(),
'/home':(context)=>Home(),
'/location':(context)=>ChooseLocation(),
},
));
选择_位置.dart
import 'package:path/path.dart';
import 'package:flutter/material.dart';
import'package:universal_time_app/services/universal_time.dart';
//import 'package:universal_time_app/pages/loading.dart';
//import 'package:universal_time_app/pages/home.dart';
class ChooseLocation extends StatefulWidget {
const ChooseLocation({Key? key}) : super(key: key);
@override
_ChooseLocationState createState() => _ChooseLocationState();
}
List<UniversalTime> locations = [
UniversalTime(url: 'Europe/London', location: 'London', flag: 'UK.png',time:'',isdaytime: 1),
UniversalTime(url: 'Europe/Athens', location: 'Athens', flag: 'Greece.png',time:'',isdaytime: 1),
UniversalTime(url: 'Africa/Cairo', location: 'Cairo', flag: 'Egypt.png',time:'',isdaytime: 1),
UniversalTime(url: 'Africa/Nairobi', location: 'Nairobi', flag: 'Kenya.png',time:'',isdaytime: 1),
UniversalTime(url: 'America/Chicago', location: 'Chicago', flag: 'usa.png',time:'',isdaytime: 1),
UniversalTime(url: 'America/New_York', location: 'New York', flag: 'usa.png',time:'',isdaytime: 1),
UniversalTime(url: 'Asia/Seoul', location: 'Seoul', flag: 'South_Korea.png',time:'',isdaytime: 1),
UniversalTime(url: 'Asia/Jakarta', location: 'Jakarta', flag: 'Indonesia.png',time:'',isdaytime: 1),
UniversalTime(url: 'Asia/Kolkata', location: 'Delhi', flag: 'India.png',time:'',isdaytime: 1),
];
//void updateTime(snapshot,context);
void updateTime(index,context) async {
//var instance = locations[index];
UniversalTime instance = locations[index];
await instance.getTime();
//navigate to home screen
Navigator.pop(context, {
'location': instance.location,
'flag': instance.flag,
'time': instance.time,
'isdaytime': instance.isdaytime
});
}
class _ChooseLocationState extends State<ChooseLocation> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blueGrey,
appBar: AppBar(
backgroundColor: Colors.greenAccent,
title: Text('Choose a location'),
centerTitle: true,
elevation: 0,
),
body: ListView.builder(
itemCount:locations.length,
itemBuilder: (context,index) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0,horizontal:10.0 ),
child: Card(
child: ListTile(
onTap: () {
updateTime(index,context);
},
title: Text(locations[index].location),
leading: CircleAvatar(
backgroundImage: AssetImage('assets/Flag_of_${locations[index].flag}'),
),
),
),
);
}
),
);
}
}
家.dart
import 'package:flutter/material.dart';
import 'package:universal_time_app/services/universal_time.dart';
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
Map data={};
@override
Widget build(BuildContext context) {
data=data.isEmpty ? data: ModalRoute.of(context)?.settings.arguments as Map;
print(data);
print('hi');
String? bgImage='Nw1.jpg';
//set bg image
if (data['isdaytime'] == 1) {
bgImage = 'Dw.jpg';
}
//print(bgImage);
//String bgImage=data['isdaytime']?'Dw.jpg':'Nw1.jpg';
return
Scaffold(
//backgroundColor: Colors.lightBlueAccent[100],x
body:Container(
decoration: BoxDecoration(
image: DecorationImage(
image:AssetImage('assets/$bgImage'),
fit: BoxFit.cover,
),
),
child: SafeArea(
child:Column(
children:<Widget>[
TextButton.icon(
onPressed:() async {
dynamic result = await Navigator.pushNamed(context, '/location');
setState(() {
data ={
'time' : result['time'],
'location' : result['location'],
'isdatime':result['isdaytime'],
'flag': result['flag'],
};
});
},
icon:Icon(Icons.edit_location_rounded,size:45.0,color: Colors.orange,),
label: Text(
'Edit Location',
style: TextStyle(
fontSize: 25.0,
color: Colors.white,
),
),
),
SizedBox(height: 230.0,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
data['location'],
style: TextStyle(
color: Colors.yellowAccent,
fontSize: 50.0,
letterSpacing: 2.0,
),
),
],
),
SizedBox(height: 20.0,),
Text(
data['time'],
style: TextStyle(
color: Colors.white,
fontSize: 70.0,
letterSpacing: 2.0,
),
),
],
),
),
),
);
}
}
loading.dart
import 'package:flutter/material.dart';
import 'package:universal_time_app/services/universal_time.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
class Loading extends StatefulWidget {
const Loading({Key? key}) : super(key: key);
@override
_LoadingState createState() => _LoadingState();
}
class _LoadingState extends State<Loading> {
void setupWorldTime () async {
UniversalTime instance=UniversalTime(location: 'Berlin',time: '', flag: 'Germany.png', url:'Europe/berlin',isdaytime:0);
await instance.getTime();
Navigator.pushReplacementNamed(context, '/home',arguments: {
'location':instance.location, 'flag':instance.flag,'time':instance.time,'isdaytime':instance.isdaytime,
});
}
@override
void initState(){
super.initState();
setupWorldTime();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.greenAccent,
body:Center(
child: SpinKitPouringHourGlassRefined(
color: Colors.white,
size: 100.0,
),
),
);
}
}
通用时间.dart
import 'package:http/http.dart';
import 'dart:convert';
import 'package:intl/intl.dart';
class UniversalTime {
String location;
String time;
String flag;
String url;
int isdaytime;
UniversalTime({
required this.time,required this.isdaytime,
required this.location,required this.flag,required this.url});
Future <void> getTime() async {
//make request
Response response = await get(Uri.parse('http://worldtimeapi.org/api/timezone/$url'));
Map data = jsonDecode(response.body);
String datetime = data['datetime'];
String offset1 = data['utc_offset'].substring(1,3);
String offset2 = data['utc_offset'].substring(4,6);
DateTime now = DateTime.parse(datetime);
now = now.add(Duration(hours: int.parse(offset1), minutes: int.parse(offset2)));
isdaytime=now.hour > 5 && now.hour < 20 ? 1:0;
print(isdaytime);
//print('aakash');
//Set the time property
time=DateFormat.jm().format(now);
//print(time);
}
}
我可能是错的,因为这是一个复杂的应用程序,我现在不能完全运行它,但是你得到的错误代码表明它在尝试读取 home.dart (我知道这是因为你堆栈上的 #0 是 home.dart 并且它显示了行号)
这是第 75 行: data['location']
这告诉我数据没有位置键,正如我所说,我可能是错的,希望第 19 行的print(data)
应该能够反驳这个理论。 所以在做任何其他事情之前,我会检查打印语句说的是什么。 无论如何,这是我对为什么会发生这种情况的猜测。
data=data.isEmpty? data: ModalRoute.of(context)?.settings.arguments as Map;
这行说:如果数据为空,数据应该等于数据,否则,数据应该等于ModalRoute...
,我敢打赌你把它弄反了,它应该是:
data=data.isEmpty? ModalRoute.of(context)?.settings.arguments as Map: data;
我还认为可能没有 arguments 作为初始路线发送回家,但你会比我更清楚这一点。
错误消息表明在代码的某处,您已将 null 分配给需要不可为空字符串的 var。 根据上面提供的代码,我最好的猜测是您的导航器在home.dart
中的result['location']
或result['time']
返回 null
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.