从另一个小部件调用小部件的方法

时间:2018-03-22 15:22:10

标签: flutter

我刚开始颤抖,这是一个基本问题,但我无法解决。 我创建了一个有状态小部件,我需要在单击按钮时调用setState()方法。该按钮不是此有状态小部件的一部分。该按钮位于应用程序的页脚中。

完整的应用程序代码:

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  build(BuildContext context) {
    return new MaterialApp(
        title: "My app title",
        home: new Scaffold(
          appBar: new AppBar(
            title: new Text("My App"),
            backgroundColor: Colors.amber,
          ),
          body: new Container(
            child: new Center(
              child: new MyStateFullWidget(),
            ),
          ),
          persistentFooterButtons: <Widget>[
            new FlatButton(
              onPressed: () {
                // I need to call the update() of MyStateFullWidget/MyStateFullWidgetState class
              },
              child: new Text("Click Here"),
              color: Colors.amber,
              textColor: Colors.white,
            ),
          ],
        ));
  }
}

class MyStateFullWidget extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyStateFullWidgetState();
  }
}

class MyStateFullWidgetState extends State<MyStateFullWidget> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return new Text("Count: $count");
  }

  update() {
    setState() {
      count++;
    }
  }
}

2 个答案:

答案 0 :(得分:2)

  

我需要在点击按钮时调用setState()方法

您可能有一些选项(或替代方案)来实现最终结果(所有这些都有不同的权衡):

  • 将状态(即count)提升为按钮和显示小组件上方的Inherited Widget。这可能是最简单或最合适的。
  • 利用某种基于动作的通信,例如Flutter Redux(您dispatch一个动作,通过StoreConnector影响显示小部件并重建)。这可以被视为提升“另一种方式”的另一种方式。州。但是,这需要一个全新的依赖关系和大量的开销给出你的简单示例,但我想指出它。
  • 您可以创建Display小部件订阅/收听的某种StreamStreamController。但是,这可能有点矫枉过正,而且我不确定在流上表示按钮点击的适当程度。

我可能还有其他解决方案没有想到;但请记住,反应式UI的目标是keep state simple

因此,如果您有多个关注某个状态的叶子小部件(想知道它,想要更改它),则可能意味着它属于更高级别的组件(例如,应用程序级别的状态,或者也许是其他一些共同的祖先 - 但两者都可以使用Inherited Widget来防止四处传递这个状态。

答案 1 :(得分:0)

您应该在table_log中使用Scaffold,而不要在State中使用。 这是有效的解决方案。

StatelessWidget