Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 从另一个小部件调用小部件的方法_Flutter - Fatal编程技术网

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

Flutter 从另一个小部件调用小部件的方法,flutter,Flutter,我刚开始发抖,这是一个基本的问题,但我无法解决。 我创建了一个有状态的小部件,需要在单击按钮时调用setState()方法。按钮不是此有状态小部件的一部分。该按钮出现在应用程序的页脚中 完整的申请代码: import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override build(BuildCont

我刚开始发抖,这是一个基本的问题,但我无法解决。 我创建了一个有状态的小部件,需要在单击按钮时调用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++;
    }
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
构建(构建上下文){
返回新材料PP(
标题:“我的应用程序标题”,
家:新脚手架(
appBar:新的appBar(
标题:新文本(“我的应用”),
背景颜色:Colors.amber,
),
主体:新容器(
孩子:新中心(
子项:新建MyStateFullWidget(),
),
),
PersistentFooter按钮:[
新扁平按钮(
已按下:(){
//我需要调用MyStateFullWidget/MyStateFullWidgetState类的update()
},
子项:新文本(“单击此处”),
颜色:颜色。琥珀色,
textColor:Colors.white,
),
],
));
}
}
类MyStateFullWidget扩展了StatefulWidget{
@凌驾
状态createState(){
返回新的MyStateFullWidgetState();
}
}
类MyStateFullWidgetState扩展了状态{
整数计数=0;
@凌驾
小部件构建(构建上下文){
返回新文本(“Count:$Count”);
}
更新(){
setState(){
计数++;
}
}
}
我需要在单击按钮时调用setState()方法

您可能有几个选项(或备选方案)来实现最终结果(所有选项都有不同的权衡):

  • 将状态(即,
    计数
    )提升到按钮和显示小部件上方。这可能是最简单或最合适的方法
  • 利用某种基于操作的通信,例如(您
    分派
    操作,该操作通过
    StoreConnector
    影响显示小部件并进行重建)。这可以看作是“提升”状态的另一种方式。然而,鉴于您的简单示例,这需要一个全新的依赖关系和大量开销,但我想指出这一点
  • 您可以创建显示小部件订阅/侦听的某种类型的和。然而,这可能有些过分,我不确定在流上表示按钮点击有多合适
可能还有其他我没有想到的解决方案;但是,请记住,反应式UI的目标是:


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

您应该在
状态下使用
支架
,而不是在
无状态小部件中使用。
这是可行的解决方案

class MyApp extends StatelessWidget {
  @override
  build(BuildContext context) {
    return MaterialApp(
        title: "My app title",
        home: MyStateFullWidget());
  }
}

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

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("My App"),
        backgroundColor: Colors.amber,
      ),
      body: Container(
        child: Center(
          child:Text("Count: $count"),
        ),
      ),
      persistentFooterButtons: <Widget>[
        FlatButton(
          onPressed: update,
          child: Text("Click Here"),
          color: Colors.amber,
          textColor: Colors.white,
        ),
      ],
    );
  }

  void update() {
    setState(() {
      count++;
    });
  }
}
类MyApp扩展了无状态小部件{
@凌驾
构建(构建上下文){
返回材料PP(
标题:“我的应用程序标题”,
主页:MyStateFullWidget());
}
}
类MyStateFullWidget扩展了StatefulWidget{
@凌驾
状态createState(){
返回MyStateFullWidgetState();
}
}
类MyStateFullWidgetState扩展了状态{
整数计数=0;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“我的应用”),
背景颜色:Colors.amber,
),
主体:容器(
儿童:中心(
子项:文本(“计数:$Count”),
),
),
PersistentFooter按钮:[
扁平按钮(
按:更新,
子:文本(“单击此处”),
颜色:颜色。琥珀色,
textColor:Colors.white,
),
],
);
}
无效更新(){
设置状态(){
计数++;
});
}
}

我通过使用继承的Widget实现了这一目的。你能举个例子说明你是如何做到这一点的吗@Anil8753?@MarkO'Sullivan我写了一篇博客。谢谢@Anil8753!我建议创建一个GitHub项目来展示这一点,以防它停止使用另一个版本的颤振/Dart@Anil8753,谢谢你的代码!顺便说一句,我如何添加输入到它?例如,如果我想添加另一个按钮/减量方法?