我有一个函数_tables()
,在构建窗口小部件时会调用一次。我需要在onTap事件中再次调用它。我尝试拨打普通电话,但没有任何反应。如何调用一个函数?
一些代码:
class DataPageState extends State<DataPage> {
....
_tables() {
if (selectedValue == "a") {
return DataA();
}
if (selectedValue == "b") {
return DataB();
}
if (selectedValue == "c") {
return DataC();
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(...
body: new Stack(children: <Widget>[
_tables(),
... new Stack(children: <Widget>[
AnimatedContainer(...),
InkWell(onTap: () => setState(
() {
_tables();
},
),)])...}
答案 0 :(得分:0)
如果要强制重建窗口小部件,则必须更改其runtimeType
或key
(请参见Widget.canUpdate
)。
对于您而言,您可以通过为小部件提供密钥并在onTap
中对其进行更新来利用这一事实:
class DataPageState extends State<DataPage> {
// ...
String selectedValue;
Key tableKey;
@override
void initState() {
super.initState();
tableKey = UniqueKey();
}
Widget _tables() {
if (selectedValue == "a") {
return DataA(
key: tableKey,
);
}
if (selectedValue == "b") {
return DataB(
key: tableKey,
);
}
if (selectedValue == "c") {
return DataC(
key: tableKey,
);
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Stack(children: <Widget>[
_tables(),
Stack(children: <Widget>[
AnimatedContainer(
// ...
),
InkWell(
onTap: () => setState(() {
tableKey = UniqueKey();
}),
)
]),
// ...
]),
),
);
}
}
如您所见,您需要在initState
中定义一个初始密钥,然后才能在onTap
中更新该密钥。有关更多信息,请参见UniqueKey
。
确保,请确保您的Data{A/B/C}
小部件具有传递给超级构造函数的命名参数key
:
class DataA extends StatelessWidget {
const DataA({
Key key,
// ...
}) : super(key: key);
}