#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» недоступен в инициализаторе, но по какой-то причине теперь он отлично работает с поздним