тип «Null» не является подтипом типа » List» «результата функции»

#flutter #dart #null

Вопрос:

Код должен нормально работать со старой версией, так как это готовое к использованию решение, но у меня возникла ошибка:

тип «Null» не является подтипом типа «Список» «результата функции»

Вот мой код:

 import 'package:first_flutter_project/shared/menu_bottom.dart'; import 'package:first_flutter_project/shared/menu_drawer.dart'; import 'package:flutter/material.dart';   class BmiScreen extends StatefulWidget {  const BmiScreen({Key? key}) : super(key: key);   @override  _BmiScreenState createState() =gt; _BmiScreenState(); }  class _BmiScreenState extends Statelt;BmiScreengt; {  final double fontSize = 18;  final TextEditingController txtHeight = TextEditingController();  final TextEditingController txtWeight = TextEditingController();  String result = '';  bool isMetric = true;  bool isImperial = false;  double? height;  double? weight;  String heightMessage = '';  String weightMessage = '';  late Listlt;boolgt; isSelected;   @override  void initState() {  isSelected = [isMetric, isImperial];  super.initState();  }   @override  Widget build(BuildContext context) {  heightMessage =  'Please insert your height in '   ((isMetric) ? 'meters' : 'inches');  weightMessage =  'Please insert your weight in '   ((isMetric) ? 'kilos' : 'pounds');   return Scaffold(  appBar: AppBar(  title: Text('BMI Calculator'),  ),  drawer: MenuDrawer(),  bottomNavigationBar: MenuBottom(),  body: Padding(  padding: const EdgeInsets.all(16.0),  child: Column(  mainAxisAlignment: MainAxisAlignment.spaceAround,  children: [  ToggleButtons(  children: [  Padding(  padding: EdgeInsets.symmetric(horizontal: 16),  child: Text(  'Metric',  style: TextStyle(  fontSize: fontSize,  ),  )),  Padding(  padding: EdgeInsets.symmetric(horizontal: 16),  child: Text(  'Imperial',  style: TextStyle(fontSize: fontSize),  )),  ],  isSelected: isSelected,  onPressed: toggleMeasure,  ),  TextField(  controller: txtHeight,  keyboardType: TextInputType.number,  decoration: InputDecoration(  hintText: heightMessage,  ),  ),  TextField(  controller: txtWeight,  keyboardType: TextInputType.number,  decoration: InputDecoration(hintText: weightMessage),  ),  ElevatedButton(  onPressed: findBMI,  child: Text('Calculate BMI',  style: TextStyle(  fontSize: fontSize,  ))),  Text(result,  style: TextStyle(  fontSize: fontSize,  ))  ],  ),  ),  );  }   void toggleMeasure(value) {  if (value == 0) {  isMetric = true;  isImperial = false;  } else {  isMetric = false;  isImperial = true;  }  setState(() {  isSelected = [isMetric, isImperial];  });  }   void findBMI() {  double bmi = 0;  double height = double.tryParse(txtHeight.text) ?? 0;  double weight = double.tryParse(txtWeight.text) ?? 0;   if (isMetric) {  bmi = weight / (height * height);  } else {  bmi = (weight * 703) / (height * height);  }  setState(() {  result = 'Your BMI is '   bmi.toStringAsFixed(2);  });  } }  

Вот трассировка стека:

 The relevant error-causing widget was:   BmiScreen BmiScreen:file:///C:/Users/San4o/AndroidStudioProjects/first_flutter_project/lib/main.dart:18:30 When the exception was thrown, this was the stack:  #0 _BmiScreenState.isSelected (package:first_flutter_project/screens/bmi_screen.dart) #1 _BmiScreenState.build (package:first_flutter_project/screens/bmi_screen.dart:67:27) #2 StatefulElement.build (package:flutter/src/widgets/framework.dart:4782:27) #3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4665:15) #4 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4840:11) #5 Element.rebuild (package:flutter/src/widgets/framework.dart:4355:5) #6 StatefulElement.update (package:flutter/src/widgets/framework.dart:4872:5) #7 Element.updateChild (package:flutter/src/widgets/framework.dart:3412:15)  

Я думаю, что могут возникнуть некоторые проблемы, связанные с инициализацией поля:

 late Listlt;boolgt; isSelected;  

И я попытался изменить его с помощью nullable, но затем у меня возникла ошибка:

 lib/screens/bmi_screen.dart:67:27: Error: The argument type 'Listlt;boolgt;?' can't be assigned to the parameter type 'Listlt;boolgt;' because 'Listlt;boolgt;?' is nullable and 'Listlt;boolgt;' isn't.  - 'List' is from 'dart:core'.  isSelected: isSelected,  ^  

Не могли бы вы посоветовать, как я могу решить эту проблему? Любая помощь будет признательна.

Спасибо

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

1. разве это не сработало бы, если бы вы выполнили инициализацию в момент объявления? Списокlt;boolgt; выбран= [isMetric, isImperial]; (или объявите его [] — скорее всего, вы предпочтете const)

2. @CetinBasoz Самое смешное, что сегодня у меня нет ошибок, и все работает нормально, без каких-либо изменений. Странный. Кстати, Listlt;boolgt; IsSelected = []; тоже отлично работает, и Listlt;boolgt;lt;boolgt; IsSelected= [isMetric, isImperial]; не так, как элемент экземпляра «isMetric» не может быть доступен в инициализаторе

Ответ №1:

Вместо late Listlt;boolgt; isSelected; того, чтобы инициализировать его, как Listlt;boolgt; isSelected = [true, false];

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

1. элемент экземпляра «isMetric» недоступен в инициализаторе, но по какой-то причине теперь он отлично работает с поздним