将函数作为参数传递 Flutter - 无法在初始化程序中访问实例成员“_handleChange”
Pass function as argument Flutter - The instance member '_handleChange' can't be accessed in an initializer
我有一个 class 开头是这样的
class MyClass extends StatefulWidget {
const MyClass({
Key key,
this.onChange,
}) : super(key: key);
final VoidCallback onChange;
@override
_MyClassState createState() => _MyClassState();
}
并且需要传递来自父级的 onChange。在父级中,我已经像下面这样定义了它,并且在我尝试将它传递给 MyClass
的地方有小部件变量,就像这样
class _ParentClassState extends State<ParentClass> {
Widget myWidget = MyClass(onChange: _handleChange,);
void _handleChange(arg) {
setState(() {
someStateVar = arg;
});
}
}
这个不行,有两个错误
The argument type 'void Function(dynamic)' can't be assigned to the parameter type 'dynamic Function()'.
The instance member '_handleChange' can't be accessed in an initializer.
感谢任何帮助,谢谢
此外:是否有更好的架构来传递将设置父级中的状态变量的函数?
编辑:第一个错误已使用下面的 rstrelba 答案修复,现在仅保留
The instance member '_handleChange' can't be accessed in an initializer.
我正在尝试这个答案 并正在做
Widget myWidget = MyClass(onChange: _ParentClassState()._handleChange,);
错误消失但超出堆栈
一些我的代码
来电者:
catTree = CatTree(onChangeCat: _onChangeCat);
'''
_onChangeCat(int catId) {
//
debugPrint('_onChangeCat callback!');
}
UI:
class CatTree extends StatefulWidget {
final Function(int catId) onChangeCat;
CatTree({this.onChangeCat});
}
状态:
class _CatTreeState extends State<CatTree> {
.....
>>>this.widget.onChangeCat(e.id);
}
// 1. you can define the type of function you want to pass as a type like this
typedef ChangeCallback<T> = void Function(T value);
class MyClass extends StatefulWidget {
const MyClass({
Key key,
this.onChange,
}) : super(key: key);
// 2. and use it like this
final ChangeCallback onChange;
@override
_MyClassState createState() => _MyClassState();
}
第二个错误修复:
解决方案 1:
class _ParentClassState extends State<ParentClass> {
Widget myWidget = MyClass(onChange: (arg) {
setState(() {
someStateVar = arg;
});
},
);
}
解决方案 2:
class _ParentClassState extends State<ParentClass> {
Widget myWidget;
void _handleChange(arg) {
setState(() {
someStateVar = arg;
});
}
@override
void initState(){
super.initState();
myWidget = MyClass(onChange: _handleChange);
}
}
我有一个 class 开头是这样的
class MyClass extends StatefulWidget {
const MyClass({
Key key,
this.onChange,
}) : super(key: key);
final VoidCallback onChange;
@override
_MyClassState createState() => _MyClassState();
}
并且需要传递来自父级的 onChange。在父级中,我已经像下面这样定义了它,并且在我尝试将它传递给 MyClass
的地方有小部件变量,就像这样
class _ParentClassState extends State<ParentClass> {
Widget myWidget = MyClass(onChange: _handleChange,);
void _handleChange(arg) {
setState(() {
someStateVar = arg;
});
}
}
这个不行,有两个错误
The argument type 'void Function(dynamic)' can't be assigned to the parameter type 'dynamic Function()'.
The instance member '_handleChange' can't be accessed in an initializer.
感谢任何帮助,谢谢
此外:是否有更好的架构来传递将设置父级中的状态变量的函数?
编辑:第一个错误已使用下面的 rstrelba 答案修复,现在仅保留
The instance member '_handleChange' can't be accessed in an initializer.
我正在尝试这个答案 并正在做
Widget myWidget = MyClass(onChange: _ParentClassState()._handleChange,);
错误消失但超出堆栈
一些我的代码
来电者:
catTree = CatTree(onChangeCat: _onChangeCat);
'''
_onChangeCat(int catId) {
//
debugPrint('_onChangeCat callback!');
}
UI:
class CatTree extends StatefulWidget {
final Function(int catId) onChangeCat;
CatTree({this.onChangeCat});
}
状态:
class _CatTreeState extends State<CatTree> {
.....
>>>this.widget.onChangeCat(e.id);
}
// 1. you can define the type of function you want to pass as a type like this
typedef ChangeCallback<T> = void Function(T value);
class MyClass extends StatefulWidget {
const MyClass({
Key key,
this.onChange,
}) : super(key: key);
// 2. and use it like this
final ChangeCallback onChange;
@override
_MyClassState createState() => _MyClassState();
}
第二个错误修复:
解决方案 1:
class _ParentClassState extends State<ParentClass> {
Widget myWidget = MyClass(onChange: (arg) {
setState(() {
someStateVar = arg;
});
},
);
}
解决方案 2:
class _ParentClassState extends State<ParentClass> {
Widget myWidget;
void _handleChange(arg) {
setState(() {
someStateVar = arg;
});
}
@override
void initState(){
super.initState();
myWidget = MyClass(onChange: _handleChange);
}
}