错误:正文可能会正常完成,导致返回"null",但返回类型"Widget"可能是不可为空的类型



我使用的是新的dart版本<2.18.1>启用了零安全。

这是我的代码

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:untitled3/product.dart';
import 'package:untitled3/product_db_helper.dart';
class ProductScreen extends StatefulWidget {
const ProductScreen({Key? key}) : super(key: key);
@override
State<ProductScreen> createState() => _ProductScreenState();
}
class _ProductScreenState extends State<ProductScreen> {
TextEditingController _idController = TextEditingController();
TextEditingController _nameController = TextEditingController();
TextEditingController _priceController = TextEditingController();
TextEditingController _quantityController = TextEditingController();
List<Product> productsList = [];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Product Screen'),
),
body: Center(
child: Column(
children: [
Expanded(child: ListView.builder(
itemCount: productsList.length,
itemBuilder: (BuildContext context , index){
if(productsList.isNotEmpty)
{
return GestureDetector(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)
),
),
);
}
}
))
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: (){
showProductDialogBox(context);
},
child: Icon(Icons.add),
backgroundColor: Colors.blue,
),
);
}
//////////////////Show product dialog box ................ Name , Price , Quantity ............
showProductDialogBox(BuildContext context)
{
Widget saveButton = TextButton(onPressed: (){
if( _idController.text.isNotEmpty &&_nameController.text.isNotEmpty && _priceController.text.isNotEmpty
&& _quantityController.text.isNotEmpty)
{
Product product = Product(id: int.parse(_idController.text), name: _nameController.text, price: _priceController.text, quantity: int.parse(_quantityController.text));
/*product.id =int.parse(_idController.text);
product.name = _nameController.text;
product.price = _priceController.text;
product.quantity =int.parse(_quantityController.text);*/
ProductDBHelper.instance.insertProduct(product).then((value){
ProductDBHelper.instance.getProductList().then((value){
setState(() {
productsList = value;
});
});
Navigator.pop(context);
});
}
}, child: Text('Save'));
Widget cancelButton = TextButton(onPressed: (){
Navigator.of(context).pop();
}, child: Text('Cancel'));
AlertDialog productDetailsBox = AlertDialog(
title: Text('Add new product'),
content: Container(
child: Wrap(
children: [
Container(
child: TextFormField(
controller: _nameController,
decoration: InputDecoration(
labelText: 'Product Name'
),
),
),
Container(
child: TextFormField(
controller: _priceController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: 'Product Price'
),
),
),
Container(
child: TextFormField(
controller: _quantityController,
keyboardType: TextInputType.number,
decoration: InputDecoration(
labelText: 'Product Quantity'
),
),
)
],
),
),
actions: [
saveButton ,
cancelButton
],
);

showDialog(context: context, builder: (BuildContext context){
return productDetailsBox;
});
}
}

我得到这个错误:

错误:主体可能正常完成,导致"null"为返回,但返回类型可能是不可为null的类型。

和运行日志中的此错误:

在调试模式下在为x86构建的Android SDK上启动lib\main.art。。。正在运行Gradle任务"assemblyDebug"。。。lib/product_screen.dart:32:错误:由于返回类型为"Widget"不允许为null。

  • "Widget"来自"package:flutter/src/widgets/framework.dart"("../../Documents/flutter/flutter_windows_3.2-stable/flutter/packages/flutter/lib/src/widgets/framework.deart"(。itemBuilder:(BuildContext上下文,索引({^

失败:生成失败,出现异常。

  • 其中:脚本"C:\Users\induw\Documents\flutter\flutter_windows_3.2-stable\flutter\packages\flutter_tools\gradle\flutter.gradle"线路:1159

  • 出现问题:任务":app:compileFlutterBuildDebug"的执行失败。

处理"命令"C:\Users\induw\Documents\flatter\flat_windows_3.2-stable\flatter\bin\flatter.bat"以非零退出值1 结束

  • 尝试:

使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获得更多日志输出。使用--scan运行以获得完整的见解。

  • 获取更多帮助,请访问https://help.gradle.org

BUILD FAILED in 2m59s异常:Gradle任务汇编调试失败带有退出代码

Expanded(child: ListView.builder(
itemCount: productsList.length,
itemBuilder: (BuildContext context , index)...{...
if(productsList.isNotEmpty)
{
return GestureDetector(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)
),
),
);
}
}
))

这就是错误所在。我把。。。。红色下划线所在的位置。请帮帮我,我是个初学者。

您需要从itemBuilder返回一个小部件,只有在满足if (productsList.isNotEmpty) {时才返回当前代码段。您可以在else状态下返回一个默认的小部件。

itemCount: productsList.length,
itemBuilder: (BuildContext context, index) {
if (productsList.isNotEmpty) {
return GestureDetector(
child: Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(10)),
),
);
}
return Text("It is empty");
})

相关内容

最新更新