type 'Null' is not a subtype of type 'String' 错误在 Flutter 中
type 'Null' is not a subtype of type 'String' error in Flutter
问题:我正在构建一个世界时间应用程序,我收到一个错误,类型 'Null' 不是类型 'String' 的子类型。我正在使用变量 isdaytime 更改背景图像该应用程序根据国家/地区的时间,白天背景图像将是白天,晚上背景图像将是夜晚。但似乎字符串在某处变得空了。请帮我解答疑惑
Error image
Main.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(),
},
));
Choose_location.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}'),
),
),
),
);
}
),
);
}
}
home.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,
),
),
);
}
}
universal_time.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 上第 75 行的值(我知道这一点是因为你的堆栈上的 #0 是 home.dart 并且它显示了行号)
这是第 75 行:data['location']
这告诉我数据没有位置键,正如我所说,我可能是错的,希望 print(data)
在线19应该可以反驳这个理论。所以在做任何其他事情之前,我会检查打印语句说的是什么。不管怎样,这是我对你为什么会这样的猜测。
data=data.isEmpty ? data: ModalRoute.of(context)?.settings.arguments as Map;
这一行说:如果数据为空,数据应该等于数据,否则,数据应该等于ModalRoute...
,我打赌你倒过来了,它应该是:
data=data.isEmpty ? ModalRoute.of(context)?.settings.arguments as Map: data;
我也认为有可能不带任何参数地发送 home 作为初始路由,但你会比我更清楚这一点。
该错误消息表明在代码的某处,您已将 null 分配给需要不可为 null 的字符串的 var。根据上面提供的代码,我最好的猜测是您的导航器在 home.dart
中的 result['location']
或 result['time']
返回 null
的结果
问题:我正在构建一个世界时间应用程序,我收到一个错误,类型 'Null' 不是类型 'String' 的子类型。我正在使用变量 isdaytime 更改背景图像该应用程序根据国家/地区的时间,白天背景图像将是白天,晚上背景图像将是夜晚。但似乎字符串在某处变得空了。请帮我解答疑惑
Error image
Main.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(),
},
));
Choose_location.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}'),
),
),
),
);
}
),
);
}
}
home.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,
),
),
);
}
}
universal_time.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 上第 75 行的值(我知道这一点是因为你的堆栈上的 #0 是 home.dart 并且它显示了行号)
这是第 75 行:data['location']
这告诉我数据没有位置键,正如我所说,我可能是错的,希望 print(data)
在线19应该可以反驳这个理论。所以在做任何其他事情之前,我会检查打印语句说的是什么。不管怎样,这是我对你为什么会这样的猜测。
data=data.isEmpty ? data: ModalRoute.of(context)?.settings.arguments as Map;
这一行说:如果数据为空,数据应该等于数据,否则,数据应该等于ModalRoute...
,我打赌你倒过来了,它应该是:
data=data.isEmpty ? ModalRoute.of(context)?.settings.arguments as Map: data;
我也认为有可能不带任何参数地发送 home 作为初始路由,但你会比我更清楚这一点。
该错误消息表明在代码的某处,您已将 null 分配给需要不可为 null 的字符串的 var。根据上面提供的代码,我最好的猜测是您的导航器在 home.dart
中的 result['location']
或 result['time']
返回 null