тип string не является подтипом типа int в flutter

#javascript #java #flutter #dart

#javascript #java #flutter #dart

Вопрос:

У меня такая проблема с этим кодом, я пытался преобразовать переменные в динамические, но это не сработало, надеюсь, кто-нибудь знает решение, спасибо, пожалуйста, помогите.

У меня такая проблема с этим кодом, я пытался преобразовать переменные в динамические, но это не сработало, надеюсь, кто-нибудь знает решение, спасибо, пожалуйста, помогите.

 import 'package:flutter/material.dart';
import 'package:clima/utilities/constants.dart';
import 'package:clima/services/weather.dart';

class LocationScreen extends StatefulWidget {
  LocationScreen({this.locationWeather});
  final locationWeather;
  @override
  _LocationScreenState createState() => _LocationScreenState();
}

class _LocationScreenState extends State<LocationScreen> {
  WeatherModel weather = WeatherModel();
  int temperature;
  String weatherIcon;
  String cityName;
  String weatherMessage;
  @override
  void initState() {
    // ignore: todo
    // TODO: implement initState
    super.initState();
    updateUI(widget.locationWeather);
  }

  // ignore: non_constant_identifier_names
  void updateUI(dynamic WeatherData) {
    setState(() {
      temperature = WeatherData['main']['temp'];

      var condition = WeatherData['weather'][0]['description'];

      weatherIcon = weather.getWeatherIcon(condition);

      weatherMessage = weather.getMessage(temperature);

      cityName = WeatherData['name'];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(
          image: DecorationImage(
            image: AssetImage('images/location_background.jpg'),
            fit: BoxFit.cover,
            colorFilter: ColorFilter.mode(
                Colors.white.withOpacity(0.8), BlendMode.dstATop),
          ),
        ),
        constraints: BoxConstraints.expand(),
        child: SafeArea(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: <Widget>[
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  FlatButton(
                    onPressed: () {},
                    child: Icon(
                      Icons.near_me,
                      size: 50.0,
                    ),
                  ),
                  FlatButton(
                    onPressed: () {},
                    child: Icon(
                      Icons.location_city,
                      size: 50.0,
                    ),
                  ),
                ],
              ),
              Padding(
                padding: EdgeInsets.only(left: 15.0),
                child: Row(
                  children: <Widget>[
                    Text(
                      '$temperature°',
                      style: kTempTextStyle,
                    ),
                    Text(
                      weatherIcon,
                      style: kConditionTextStyle,
                    ),
                  ],
                ),
              ),
              Padding(
                padding: EdgeInsets.only(right: 15.0),
                child: Text(
                  '$weatherMessage as  in $cityName',
                  textAlign: TextAlign.right,
                  style: kMessageTextStyle,
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
  

Комментарии:

1. Это Java или Javascript? По сути, это игрушка, предназначенная для написания небольших фрагментов кода, традиционно используемая и злоупотребляемая неопытными программистами. Другой — это язык сценариев для веб-браузеров.

2. Эй, в основном это ваша модель. Вы можете возвращать целое число для ключа ‘temp’ в WeatherData. Но пока вы не опубликуете свою модель, не могу подтвердить.

3. @Pushpendra Проверьте это codeshare.io/24r69L

4. Похоже, что ваши погодные данные (я предполагаю, что json) предоставляют строку вместо int для температуры и / или состояния. Попробуйте передать int.parse(условие) и int.parse(температура) в вашу модель погоды.

Ответ №1:

Попробуйте это,

   void updateUI(dynamic weatherData) {
    setState(() {
      if (weatherData == null) {
        temperature = 0;
        weatherIcon = 'Error';
        weatherMessage = 'Unable to get weather data';
        cityName = '';
        return;
      }
      double temp = weatherData['main']['temp'];
      temperature = temp.toInt();
      var condition = weatherData['weather'][0]['id'];
      weatherIcon = weather.getWeatherIcon(condition);
      weatherMessage = weather.getMessage(temperature);
      cityName = weatherData['name'];
    });
  }
  

Ответ №2:

Когда вы получаете доступ к данным из map, вам нужно явно указать, что это int , попробуйте выполнить приведение WeatherData['weather'][0]['description'] к WeatherData['weather'][0]['description'] as int . Кроме того, если какие-либо данные обнуляются, вам также нужно явно указать это с вопросительным знаком int? , не уверен WeatherData , допускает ли это ваша модель или нет.

     setState(() {
      temperature = WeatherData['main']['temp']  as int ;

      var condition = WeatherData['weather'][0]['description'];

      weatherIcon = weather.getWeatherIcon(condition);

      weatherMessage = weather.getMessage(temperature);

      cityName = WeatherData['name'];
    });
  }