我正在一个论坛上,该论坛可以根据之前的问题提供的答案动态生成更多问题(例如,如果您回答“是”,则在问题3下方添加2个问题)。让我担心的是,每当我“显示”一个新问题时,它都会重新渲染整个屏幕,从而使其效率低下。 我提供了一个问题示例,当回答该问题时将生成一个文本,该文本将代表我的论坛中的另一个问题。这就是我实施的方式,效率会低下(因为整个屏幕都会重新渲染),我如何确保只渲染“新”问题?
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class StackOverFlow extends StatefulWidget {
@override
_StackOverFlowState createState() => _StackOverFlowState();
}
class _StackOverFlowState extends State<StackOverFlow> {
bool value = false;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Are you good?"),
Checkbox(
checkColor: Colors.blue,
value: value,
onChanged: (bool) {
setState(() {
value = bool;
});
print(bool);
},
),
],
),
value ? Text("Your checkbox is a yes") : Container(),
],
),
),
);
}
}
答案 0 :(得分:2)
不,这不会是低效率的。您应该维护一个包含问题数据的questions
列表,并且您的build
函数应该呈现当前问题。当您决定在事件处理函数中添加新问题时,只需在setState
中添加新问题,例如
setState(() {
questions.add(Question("How old are you"?));
})
,您的新问题列表将重新呈现。
此重新渲染是响应式框架的工作方式。您不应尝试解决此问题以创建“更有效”的解决方案。您在build
函数中创建的小部件是轻量级对象,Dart VM经过优化,可以非常频繁地创建和销毁许多小部件。通过获取您在每个build
中创建的窗口小部件的差异来更改实际的UI元素。