如何解决从父 Stateful 小部件调用子 Stateful 上的 setState
当我在子有状态小部件中调用 setState 时。它显示错误或警告。有没有什么方法可以在 Stateful 小部件中调用 Stateful 小部件而不会导致错误或有什么好的方法来做同样的事情?
这是我的示例代码:
parent.dart
class Parent extends StatefulWidget {
@override
_ParentState createState() => _ParentState();
}
class _ParentState extends State<Parent> {
var title = "Parent";
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ListView(
children: <Widget>[
Text(title),Child(init:true),// <-- Calling Child Widget
],),);
}
}
child.dart
class Child extends StatefulWidget {
final bool init; // <- Showing warning on removing 'final'
// This class (or a class that this class inherits from) is marked as '@immutable',but one or more of its instance fields aren't final: Child.init
Child({
Key? key,required this.init,}) : super(key: key);
@override
_ChildState createState() => _ChildState();
}
class _ChildState extends State<Child> {
@override
Widget build(BuildContext context) {
return Container(
color: widget.init ? Colors.red : Colors.blue,child: TextButton(
onPressed: () {
setState(
() {
// widget.init = false;
// want to change 'wiget.init' but its final
// removing final causing warning
},);
},child: Text("Click me"),);
}
}
解决方法
你可以传递改变init变量的函数。
class Parent extends StatefulWidget {
@override
_ParentState createState() => _ParentState();
}
class _ParentState extends State<Parent> {
var title = "Parent";
var init = true;
void setInitFalse(){
setState((){
init = false;
})
}
bool getInit(){
return init;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: ListView(
children: <Widget>[
Text(title),Child(init: getInit(),setInitFalse: setInitFalse()),],),);
}
}
然后在孩子
class Child extends StatefulWidget {
final Function init; // <- Showing warning on removing 'final'
// This class (or a class that this class inherits from) is marked as '@immutable',but one or more of its instance fields aren't final: Child.init
final Function setInitFalse;
Child({
Key? key,required this.init,required this.setInitFalse
}) : super(key: key);
@override
_ChildState createState() => _ChildState();
}
class _ChildState extends State<Child> {
@override
Widget build(BuildContext context) {
return Container(
color: widget.init() ? Colors.red : Colors.blue,child: TextButton(
onPressed: () {
widget.setInitFalse();
},child: Text("Click me"),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。