我使用以下示例进行测试和学习如何从子窗口小部件调用父函数。
当您单击TestButton时,将调用countRefresh函数,并且变量计数会增加1。
现在,每次单击它时,按钮都会更改颜色(蓝色或红色)。
问题:假设我想根据围绕计数变量的某些逻辑更改颜色,如何从TestButton小部件中访问计数变量? 例如,如果count是三的倍数,则应将按钮设置为红色,否则为蓝色。
我阅读了InheritedWidgets的相关资料,但似乎必须将变量定义为InheritedWidgets内部final(如果我在int count = 0;之前不放置final,则会收到“此类被标记为不可变”消息错误)。 但是基于此示例,我需要每次单击按钮时更改count。 除了InheritedWidgets,还有什么替代方法?
问题:假设我想根据围绕计数变量的某些逻辑更改颜色,如何从TestButton小部件中访问计数变量? 例如,如果count是三的倍数,则应将按钮设置为红色,否则为蓝色。
我阅读了InheritedWidgets的相关资料,但似乎必须将变量定义为InheritedWidgets内部final(如果我在int count = 0;之前不放置final,则会收到“此类被标记为不可变”消息错误)。 但是基于此示例,我需要每次单击按钮时更改count。 除了InheritedWidgets,还有什么替代方法?
import 'package:flutter/material.dart';
class Test extends StatefulWidget {
static const String id = 'test';
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
int count = 0;
Color color = Colors.red;
void refreshCount() {
setState(() {
count += 1;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:
Text('The button was pressed $count time${count == 1 ? '' : 's'}'),
),
floatingActionButton: TestButton(
color: color,
notifyParent: refreshCount,
),
);
}
}
class TestButton extends StatefulWidget {
TestButton({
@required this.color,
@required this.notifyParent,
});
final Color color;
final void Function() notifyParent;
@override
_TestButtonState createState() => _TestButtonState();
}
class _TestButtonState extends State<TestButton> {
Color color;
void initState() {
color = widget.color;
super.initState();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
widget.notifyParent();
setState(() {
color = color == Colors.red ? Colors.blue : Colors.red;
});
},
child: Container(
child: Icon(
Icons.add,
size: 80,
),
color: color,
),
);
}
}