如何在Widget Build方法中回调函数?

时间:2019-11-24 16:38:54

标签: flutter dart

我有一个函数_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();
                      },
                    ),)])...}

1 个答案:

答案 0 :(得分:0)

如果要强制重建窗口小部件,则必须更改其runtimeTypekey(请参见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);
}