Flutter 颤振-单击一个升起按钮,所有升起按钮更新
我正在开发一个计算器类型的应用程序,它在屏幕上有很多按钮。当我打开dev工具检查重新绘制时,我注意到每当单击一个按钮时,屏幕上的每个按钮都会重新绘制。我没有在这里粘贴大量代码,而是创建了一个演示应用程序,显示我正在做什么。这是屏幕的外观: 每当按下任何按钮时,屏幕上的每个按钮都会重新绘制 这是我正在使用的代码:Flutter 颤振-单击一个升起按钮,所有升起按钮更新,flutter,flutter-layout,Flutter,Flutter Layout,我正在开发一个计算器类型的应用程序,它在屏幕上有很多按钮。当我打开dev工具检查重新绘制时,我注意到每当单击一个按钮时,屏幕上的每个按钮都会重新绘制。我没有在这里粘贴大量代码,而是创建了一个演示应用程序,显示我正在做什么。这是屏幕的外观: 每当按下任何按钮时,屏幕上的每个按钮都会重新绘制 这是我正在使用的代码: @override Widget build(BuildContext context) { return Scaffold( appBar: AppBa
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Button Testing'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
buttonPressed,
textAlign: TextAlign.center,
),
SizedBox(
height: 10.0,
),
RaisedButton(
child: Text('Button One'),
onPressed: () {
setState(() {
buttonPressed = 'Button One Was Pressed';
});
},
),
RaisedButton(
child: Text('Button Two'),
onPressed: () {
setState(() {
buttonPressed = 'Button Two Was Pressed';
});
},
),
RaisedButton(
child: Text('Button Three'),
onPressed: () {
setState(() {
buttonPressed = 'Button Three Was Pressed';
});
},
),
RaisedButton(
child: Text('Button Four'),
onPressed: () {
setState(() {
buttonPressed = 'Button Four Was Pressed';
});
},
),
],
),
),
),
);
}
@覆盖
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“按钮测试”),
),
正文:中(
孩子:填充(
填充:常数边集全部(8.0),
子:列(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.stretch,
儿童:[
正文(
按下按钮,
textAlign:textAlign.center,
),
大小盒子(
身高:10.0,
),
升起的按钮(
子项:文本(“按钮一”),
已按下:(){
设置状态(){
buttonPressed='按钮一已按下';
});
},
),
升起的按钮(
子项:文本(“按钮二”),
已按下:(){
设置状态(){
buttonPressed='按钮2已按下';
});
},
),
升起的按钮(
子项:文本(“按钮三”),
已按下:(){
设置状态(){
按钮按下='按钮三按下';
});
},
),
升起的按钮(
子项:文本(“按钮四”),
已按下:(){
设置状态(){
按钮按下='按钮四按下';
});
},
),
],
),
),
),
);
}
我试着将按钮区域拆分成一个单独的小部件,但我所做的一切都无关紧要。我的问题是,还有什么我应该做的吗?这是预期的和可接受的行为吗?无论何时点击任何按钮,都会重新绘制,这有关系吗?我认为在Flatter中,只需要重新绘制需要重新绘制的内容。无论何时调用setState,它都会重新生成整个构建方法,因此很明显,它会重新生成RaisedButton 您可以通过使用提供者、Bloc等来避免这种情况,因为它们不会重建整个构建方法。它只会更改数据 这完全取决于你是否愿意接受它。根据我的说法,若小部件并没有那个么大,你们可以保留它
每次重新绘制小部件都不是很好的做法,但是如果它不是很频繁地重建,或者您的应用程序没有那么大,那么就可以了。
setState
将重建所有屏幕
因此,您可以通过使用Bloc来避免这种情况,它是一个状态控制器,不会重建所有内容,只重建您需要重建的内容。您可以从头开始使用它,或者使用插件
Bloc 1.0.0
它对于这样一个基本布局来说是正常和可接受的。如果您需要更复杂的屏幕,请选择网络调用、嵌套层次结构等。。然后考虑使用提供者、BUC体系结构只重画需要重新绘制的东西。