在 void 函数中使用 setState,并收到一条警告,指出 void 函数(动态)不能分配给参数类型"void Function()"



我得到一个警告,参数类型'void Function(dynamic)'不能分配给参数类型'void Function()',这是在字符串dialogText下面的行。我使用这个函数将数据从子部件TopAppBar传递到父部件MyApp。在子小部件TopAppBar中,我使用TextFormField输入单词,以便在提交时更改文本。

我看到其他代码没有问题,所以我不知道如何解决这个问题。

请帮帮我!谢谢你!

class MyApp extends StatefulWidget {
MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int count = 0;
var nameList = ['one','two','three','four'];
String dialogText = "Hello!";
void _changeDialogText(value){
setState((value){
dialogText = value;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TopAppBar(state: _changeDialogText,),
body: Column(
children: [
Container(
height: 400,
child: (
ListView(
children: List.generate(
nameList.length, (index) => CustomListTile(title: nameList[index])),
)
)
),
Container(
height: 20, child: Text(count.toString())
),
Container(
height: 20, child: Text(dialogText)
),
],
),
floatingActionButton: FloatingActionButton(
child: Text('Button'),
onPressed: (){
print('a');
setState(
(){
count++;
}
);
},
),
bottomNavigationBar: BottomBar(),
floatingActionButtonLocation: FloatingActionButtonLocation.endDocked
);
}
}
class TopAppBar extends StatefulWidget  with PreferredSizeWidget{
const TopAppBar({Key? key, required this.state(value)}) : super(key: key);
final Function(String value) state;
@override
Size get preferredSize => Size.fromHeight(kToolbarHeight);
State<TopAppBar> createState() => _TopAppBarState();
}

class _TopAppBarState extends State<TopAppBar> {
final TopAppBarData _topAppBarData = TopAppBarData();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Form(
child:
AppBar(
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: <Color>[Color.fromRGBO(180, 44, 77, 1) , Color.fromRGBO(242, 114, 59, 1)]
)
),
),
elevation: 0.0,
centerTitle: false,
title: Row(
children: [
Text(
'SSG',
style: TextStyle(
color: Colors.white,
),
),
Icon(
Icons.expand_more,
color: Colors.black,
)
],
),
actions: [
Padding(
padding: EdgeInsets.only(right: 30.0),
child: IconButton(
icon: Icon(Icons.search),
color: Colors.black,
onPressed: (){
showDialog(context: context, builder: (context){
return AlertDialog(
title: Text('Search'),
content: TextFormField(
onChanged: (value) {
widget.state(value);
},
decoration: InputDecoration(hintText: "Text Field in Dialog"),
),
actions: <Widget>[
ElevatedButton(
child: Text('CANCEL'),
onPressed: () {
setState(() {
Navigator.pop(context);
});
},
),
ElevatedButton(
child: Text('OK'),
onPressed: () {
setState(() {
Navigator.pop(context);
});
},
),
],
);
});
},
)
),
Padding(
padding: EdgeInsets.only(right: 30.0),
child: GestureDetector(
onTap: () {},
child: Icon(
Icons.menu,
color: Colors.black,
),
)
),
Padding(
padding: EdgeInsets.only(right: 30.0),
child: GestureDetector(
onTap: () {},
child: Icon(
Icons.notification_add,
color: Colors.black,
),
)
),
],
),
);
}
}

setState()函数不向回调传递任何参数。代码应该像这样:

setState(() {
dialogText = value;
});

你的问题源于你如何设置你的状态。setState函数接受一个参数void Function(),如下所示:

package:flutter/src/widgets/framework.dart 
void setState(void Function() fn)  
Containing class: State  Type: void Function(void Function())

但是,您添加了一个不必要的dynamic类型的参数value。改变

void _changeDialogText(value){
setState((value){
dialogText = value;
});
}

void _changeDialogText(String value){
setState((){
dialogText = value;
});
}

将消除该警告。但是,您可能想要考虑使用显式类型,并通过在分析选项文件中添加隐式动态来强制使用。

同样,在构造函数中初始化final Function(String value) state;变量时,使用:
const TopAppBar({Key? key, required this.state(value)}) : super(key: key);

但是,这是不必要的,并且在"value"上缺少类型。参数。所以你可以用这个代替:

const TopAppBar({Key? key, required this.state}) : super(key: key);

如果省略类型,则编译器假定为dynamic。不要那样做。打开你的过滤器(默认是打开的),它会警告你。

final /* --> */ void /* <-- */  Function(String value) state;

void _changeDialogText( /* --> */ String /* <-- */ value){

现在,签名匹配。

change this

void _changeDialogText(value){
setState((value){
dialogText = value;
});
}

void _changeDialogText(String value){
setState((value){
dialogText = value;
});
}

最新更新