繁体   English   中英

type 'Null' is not a subtype of type 'String' 错误 in Flutter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM