Flutter - NoSuchMethodError: метод получения isNotEmpty был вызван для нулевого значения - PullRequest
0 голосов
/ 04 августа 2020

Это приложение мирового времени, которое начинается с главного экрана, показывающего вначале местоположение по умолчанию, затем вы можете изменить местоположение, и API покажет вам время в этом новом местоположении. Он работает нормально, но когда я нажимаю кнопку «Назад» на панели «Местоположение», появляется сообщение об ошибке !!

Вот мой домашний код:

class _HomeState extends State<Home> {
Map data = {};
@override
Widget build(BuildContext context) {
//the argument method is taking data from another route
//I use this 
data = data.isNotEmpty ? data : ModalRoute.of(context).settings.arguments;

//data = ModalRoute.of(context).settings.arguments;

//isDaytime is a bool
String bgImage = data['isDaytime'] ? 'day.png' : 'night.png';
Color bar = data['isDaytime'] ? Colors.blue[300] : Colors.indigo[900]; 

return Scaffold(
  backgroundColor: bar,
  body: SafeArea(
    child: Container(
      width: 415.0,
      decoration: BoxDecoration(
        image: DecorationImage(
          image: AssetImage('assets/$bgImage'),
          fit: BoxFit.cover,
        ),
      ),
      child: Padding(
        padding: const EdgeInsets.fromLTRB(0, 120.0, 0, 0),
        child: Column(
          children: <Widget>[
            FlatButton.icon(
              onPressed: () async {
                dynamic result =
                    await Navigator.pushNamed(context, '/location');
                setState(() {
                  data = result;
                });
              },
              icon: Icon(
                Icons.edit_location,
                color: Colors.grey[200],
                size: 25.0,
              ),
              label: Text(
                'Edit Location',
                style: TextStyle(
                  color: Colors.grey[200],
                  fontSize: 20.0,
                ),
              ),
            ),
            RichText(
              text: TextSpan(
                text: data['location'],
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 40.0,
                ),
              ),
            ),
            RichText(
              text: TextSpan(
                text: data['time'],
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 70.0,
                ),
              ),
            ),
          ],
        ),
      ),
    ),
  ),
);

}}

и вот код экрана моего местоположения:

class location extends StatefulWidget {
  @override
 _locationState createState() => _locationState();
}

  class _locationState extends State<location> {
 List<Worldtime> locations = [
   Worldtime(url: 'Africa/Cairo', location: 'Cairo', flag: 'egypt.png'),
   Worldtime(url: 'Europe/London', location: 'London', flag: 'uk.png'),
  Worldtime(url: 'America/New_York', location: 'New york', flag: 'usa.png'),
  Worldtime(url: 'Europe/Berlin', location: 'Berlin', flag: 'germany.png')
  ];

  void updateTime(index) async {
Worldtime instance = locations[index];
await instance.getTime();

Navigator.pop(context, {
  'location' : instance.location,
  'flag' : instance.flag,
  'time' : instance.time,
  'isDaytime' : instance.isDaytime,
});
}

 @override
Widget build(BuildContext context) {
return Scaffold(
  body: ListView.builder(
      itemCount: locations.length,
      itemBuilder: (context, index) {
        return Padding(
          padding:
              const EdgeInsets.symmetric(vertical: 1.0, horizontal: 4.0),
          child: Card(
            child: ListTile(
              title: Text(locations[index].location),
              leading: CircleAvatar(
                backgroundImage:
                    AssetImage('assets/${locations[index].flag}'),
              ),
              onTap: () {
                updateTime(index);
              },
            ),
          ),
        );
      }),
  appBar: AppBar(
    title: Text('Choose Location'),
    backgroundColor: Colors.grey[800],
    elevation: 0,
  ),
);
 }
 }

1 Ответ

0 голосов
/ 04 августа 2020

Вы выполняете

data = await Navigator.pushNamed(context, '/location')

, который при нажатии кнопки возврата

await Navigator.pushNamed(context, '/location')

имеет значение null, поэтому данные будут нулевыми.

Оберните ваш эшафот на странице местоположения с виджетом WillPopScope и вывести маршрут с желаемыми данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...