Flutter 颤振:如何从另一个小部件更改/刷新状态
我尝试在一个小部件中显示一个全局整数,然后通过另一个小部件中的某个内容(按钮单击或其他内容)进行更新。我尝试过的所有其他方法都不起作用。最好的方法是什么 堆栈溢出表示我的代码太多,所以文本太多Flutter 颤振:如何从另一个小部件更改/刷新状态,flutter,Flutter,我尝试在一个小部件中显示一个全局整数,然后通过另一个小部件中的某个内容(按钮单击或其他内容)进行更新。我尝试过的所有其他方法都不起作用。最好的方法是什么 堆栈溢出表示我的代码太多,所以文本太多 导入“包装:颤振/材料.省道”; void main(){ runApp( 材料聚丙烯( 家:脚手架( 主体:容器( 子:列( mainAxisAlignment:mainAxisAlignment.space, 儿童:[ ScoreDisplay(), PointButton(), ], ), ), )
导入“包装:颤振/材料.省道”;
void main(){
runApp(
材料聚丙烯(
家:脚手架(
主体:容器(
子:列(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
ScoreDisplay(),
PointButton(),
],
),
),
),
),
);
}
智力得分=0;
类ScoreDisplay扩展了StatefulWidget{
@凌驾
_ScoreDisplayState createState()=>\u ScoreDisplayState();
}
类_ScoreDisplayState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回中心(
子:容器(
子:文本(
“分数:$Score”,
),
),
);
}
}
类PointButton扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回中心(
子:容器(
孩子:升起按钮(
//在增加分数时,
),
),
);
}
}
您需要为此实施某种状态管理
这里有两种实现此功能的基本方法:使用StatefulWidget和Riverpod
1.用一个有状态的小部件
我将您的Scaffold提取为一个StatefulWidget
来维护应用程序的分数
然后,我使用ScoreDisplay
作为纯StatelessWidget
接收score
作为参数。您的PointButton
也是无状态的,通过一个简单的VoidCallback
函数调用ScorePage
完整源代码:
导入“包装:颤振/材料.省道”;
void main(){
runApp(
材料聚丙烯(
主页:ScorePage(),
),
);
}
类ScorePage扩展StatefulWidget{
常数记分页({
关键点,
}):super(key:key);
@凌驾
_ScorePageState createState()=>\u ScorePageState();
}
类_ScorePageState扩展状态{
智力得分=0;
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
子:列(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
分数显示(分数:分数),
PointButton(onIncrement:()=>setState(()=>score++),
],
),
),
);
}
}
类ScoreDisplay扩展了无状态小部件{
最终智力得分;
constscoresplay({Key-Key,this.score}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回中心(
子:容器(
子:文本(
“分数:$Score”,
),
),
);
}
}
类PointButton扩展了无状态小部件{
最终增加额;
constpointbutton({Key-Key,this.onIncrement}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回中心(
子:容器(
儿童:升降按钮(
onPressed:()=>onIncrement?.call(),
子:文本(“单击我”),
),
),
);
}
}
2.与Riverpod
创建一个StateProvider
:
final scoreProvider=StateProvider((ref)=>0);
查看状态提供程序
:
final score=useProvider(scoreProvider)。状态;
更新StateProvider
context.read(scoreProvider).state++
完整源代码
导入“包装:颤振/材料.省道”;
进口“包装:颤振钩/颤振钩.省道”;
进口“包装:hooks_riverpod/hooks_riverpod.dart”;
void main(){
runApp(
提供镜(
孩子:MaterialApp(
家:脚手架(
主体:容器(
子:列(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
ScoreDisplay(),
PointButton(),
],
),
),
),
),
),
);
}
智力得分=0;
类ScoreDisplay扩展了Widget{
@凌驾
小部件构建(构建上下文){
最终分数=useProvider(scoreProvider).state;
返回中心(
子:容器(
子:文本(
“分数:$Score”,
),
),
);
}
}
类PointButton扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回中心(
子:容器(
儿童:升降按钮(
onPressed:()=>context.read(scoreProvider).state++,
子:文本(“单击我”),
),
),
);
}
}
最终分数提供者=状态提供者((ref)=>0);
查看更多信息和更高级的用例
但是你有。你需要为此实施某种状态管理
这里有两种实现此功能的基本方法:使用StatefulWidget和Riverpod
1.用一个有状态的小部件
我将您的Scaffold提取为一个StatefulWidget
来维护应用程序的分数
然后,我使用ScoreDisplay
作为纯StatelessWidget
接收score
作为参数。您的PointButton
也是无状态的,通过一个简单的VoidCallback
函数调用ScorePage
完整源代码:
导入“包装:颤振/材料.省道”;
void main(){
runApp(
材料聚丙烯(
主页:ScorePage(),
),
);
}
类ScorePage扩展StatefulWidget{
常数记分页({
关键点,
}):super(key:key);
@凌驾
_ScorePageState createState()=>\u ScorePageState();
}
类_ScorePageState扩展状态{
智力得分=0;
@凌驾
小部件构建(BuildC)