Flutter 更改父变量并在子控件更改时重建父控件
Change parent variable and rebuild parent widget when child widget changes Flutter
我有一个屏幕小部件和一个自定义小部件。我想在按下自定义小部件的按钮时更改屏幕小部件的值。仅举个例子;
这是使用 CustomWidget 作为子项的 MyScreen 小部件:
import './widgets/my_custom_widget.dart';
class MyScreen extends StatefulWidget {
@override
_MyScreen createState() => _MyScreenState();
}
class _MyScreen extends State<MyScreen> {
bool isChildButtonPressed = false;
@override
Widget build(BuildContext context) {
return Container(
child:MyCustomWidget());
}
}
这是 MyCustomWidget
class MyCustomWidget extends StatefulWidget {
@override
_MyCustomWidget createState() => _MyCustomWidget();
}
class _MyCustomWidget extends State<MyCustomWidget> {
@override
Widget build(BuildContext context) {
return Container(
width:200,
height:200,
child: Row(children:[
FlatButton(child:Text("I am child button"),onPressed:(){
//what should I do here to change MyScreen isChildButtonPressed to true?
}),
]
)
);
}
}
上面的代码只是我想要实现的一个例子,但是在我的应用程序中,我有一个很长的子小部件多个按钮,我想将小部件存储在一个单独的文件中,但我想更改一些变量当按下子部件的按钮时,我的父部件。
我能做的是将父变量声明为全局变量,然后使用 ValueNotifier 但我认为这不是解决此问题的好方法,因为我只需要一个屏幕中的那些变量而不是整个屏幕应用程序。
我不认为我可以使用 Provider 包,因为它只重建子部件而不是父部件。
那么你有什么建议?
谢谢
您可以在 CustomWidget onFlatButtonPressed
中创建一个文件。该字段将是回调函数或 VoidCallBack,然后在 CustomWidget 中按下平面按钮时调用该函数,并在 **MyScreen*
中定义该函数
像这样
class MyScreen extends StatefulWidget {
@override
_MyScreenState createState() => _MyScreenState();
}
class _MyScreenState extends State<MyScreen> {
bool isChildButtonPressed = false;
@override
Widget build(BuildContext context) {
return Container(
child: MyCustomWidget(
onFlatButtonPressed: (){
setState(() {
//Write what you want to do here
});
},
),
);
}
}
class MyCustomWidget extends StatefulWidget {
final VoidCallback onFlatButtonPressed;
MyCustomWidget({@required this.onFlatButtonPressed});
@override
_MyCustomWidget createState() => _MyCustomWidget();
}
class _MyCustomWidget extends State<MyCustomWidget> {
@override
Widget build(BuildContext context) {
return Container(
width: 200,
height: 200,
child: Row(
children: [
FlatButton(child: Text("I am child button"), onPressed: widget.onFlatButtonPressed),
],
),
);
}
}
我有一个屏幕小部件和一个自定义小部件。我想在按下自定义小部件的按钮时更改屏幕小部件的值。仅举个例子;
这是使用 CustomWidget 作为子项的 MyScreen 小部件:
import './widgets/my_custom_widget.dart';
class MyScreen extends StatefulWidget {
@override
_MyScreen createState() => _MyScreenState();
}
class _MyScreen extends State<MyScreen> {
bool isChildButtonPressed = false;
@override
Widget build(BuildContext context) {
return Container(
child:MyCustomWidget());
}
}
这是 MyCustomWidget
class MyCustomWidget extends StatefulWidget {
@override
_MyCustomWidget createState() => _MyCustomWidget();
}
class _MyCustomWidget extends State<MyCustomWidget> {
@override
Widget build(BuildContext context) {
return Container(
width:200,
height:200,
child: Row(children:[
FlatButton(child:Text("I am child button"),onPressed:(){
//what should I do here to change MyScreen isChildButtonPressed to true?
}),
]
)
);
}
}
上面的代码只是我想要实现的一个例子,但是在我的应用程序中,我有一个很长的子小部件多个按钮,我想将小部件存储在一个单独的文件中,但我想更改一些变量当按下子部件的按钮时,我的父部件。
我能做的是将父变量声明为全局变量,然后使用 ValueNotifier 但我认为这不是解决此问题的好方法,因为我只需要一个屏幕中的那些变量而不是整个屏幕应用程序。
我不认为我可以使用 Provider 包,因为它只重建子部件而不是父部件。
那么你有什么建议?
谢谢
您可以在 CustomWidget onFlatButtonPressed
中创建一个文件。该字段将是回调函数或 VoidCallBack,然后在 CustomWidget 中按下平面按钮时调用该函数,并在 **MyScreen*
像这样
class MyScreen extends StatefulWidget {
@override
_MyScreenState createState() => _MyScreenState();
}
class _MyScreenState extends State<MyScreen> {
bool isChildButtonPressed = false;
@override
Widget build(BuildContext context) {
return Container(
child: MyCustomWidget(
onFlatButtonPressed: (){
setState(() {
//Write what you want to do here
});
},
),
);
}
}
class MyCustomWidget extends StatefulWidget {
final VoidCallback onFlatButtonPressed;
MyCustomWidget({@required this.onFlatButtonPressed});
@override
_MyCustomWidget createState() => _MyCustomWidget();
}
class _MyCustomWidget extends State<MyCustomWidget> {
@override
Widget build(BuildContext context) {
return Container(
width: 200,
height: 200,
child: Row(
children: [
FlatButton(child: Text("I am child button"), onPressed: widget.onFlatButtonPressed),
],
),
);
}
}