Flutter 从另一个小部件调用小部件的方法
我刚开始发抖,这是一个基本的问题,但我无法解决。 我创建了一个有状态的小部件,需要在单击按钮时调用setState()方法。按钮不是此有状态小部件的一部分。该按钮出现在应用程序的页脚中 完整的申请代码:Flutter 从另一个小部件调用小部件的方法,flutter,Flutter,我刚开始发抖,这是一个基本的问题,但我无法解决。 我创建了一个有状态的小部件,需要在单击按钮时调用setState()方法。按钮不是此有状态小部件的一部分。该按钮出现在应用程序的页脚中 完整的申请代码: import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp extends StatelessWidget { @override build(BuildCont
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
- 您可以创建显示小部件订阅/侦听的某种类型的和。然而,这可能有些过分,我不确定在流上表示按钮点击有多合适
因此,如果您有多个关注某个状态的叶子部件(想要知道它,想要更改它),这可能意味着它属于更高级别的组件(例如,应用程序级别的状态部件,或者可能是其他一些共同的祖先-但两者都可以使用继承的部件来防止到处传递状态部件)您应该在
状态下使用支架
,而不是在无状态小部件中使用。
这是可行的解决方案
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,谢谢你的代码!顺便说一句,我如何添加输入到它?例如,如果我想添加另一个按钮/减量方法?