如何在不重新渲染整个屏幕的情况下在屏幕上加载更多数据?

时间:2019-07-02 09:33:22

标签: flutter

我正在一个论坛上,该论坛可以根据之前的问题提供的答案动态生成更多问题(例如,如果您回答“是”,则在问题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(),
          ],
        ),
      ),
    );
  }
}

1 个答案:

答案 0 :(得分:2)

不,这不会是低效率的。您应该维护一个包含问题数据的questions列表,并且您的build函数应该呈现当前问题。当您决定在事件处理函数中添加新问题时,只需在setState中添加新问题,例如

setState(() {
  questions.add(Question("How old are you"?));
})

,您的新问题列表将重新呈现。

此重新渲染是响应式框架的工作方式。您不应尝试解决此问题以创建“更有效”的解决方案。您在build函数中创建的小部件是轻量级对象,Dart VM经过优化,可以非常频繁地创建和销毁许多小部件。通过获取您在每个build中创建的窗口小部件的差异来更改实际的UI元素。