颤动:我如何不必要地一次又一次地停止渲染“Widget build()”?

问题描述 投票:0回答:2

这是Flutter中的一个小POC,我的build()函数被一次又一次地调用。

没有任何循环就没有预料到这一点,经过大量的研究,我也在initState()中调用了“Future”。

但仍面临同样的问题。

提前谢谢你的时间!

我试过了什么..

import 'package:flutter/material.dart';

//http_request
import 'package:http/http.dart' as http; //to handle the http request
// import 'dart:async'; // for async functions
import 'dart:async' show Future;
import 'dart:convert'; //to convert the http response in JSON formate

import 'HomePage.dart';

    class Reports extends StatefulWidget {
      @override
      _Reports createState() => _Reports();
    }

    class _Reports extends State<Reports> {
  static String url = "Some Url";
  String _response = "abc";
  @override
  void initState() {
    super.initState();
    getTradeName_dropdown_ITR_Computation_DATA();
  }

  @override
  Widget build(BuildContext context) {

    print('body');

    return Scaffold(
      body: Container(
        child: new Text(_response),
      ),
    );
  }

  Future getTradeName_dropdown_ITR_Computation_DATA() async {
    try {
      http.Response response =
              await http.get("http://" + url );
      if (this.mounted) {
        setState(() {

          String jsonTradeName_dropdown = response.body;
          _response = jsonTradeName_dropdown;
        });
      }
    } on Exception {
      setState(() {
        _response = "Some error occored. Please Try again...";
      });
    }
  }
}

输出:

I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
I/flutter ( 5760): body
dart flutter
2个回答
1
投票

理解build()的正确模型是你应该想象它每秒被调用60次。所以你的build()例程应该是快速且幂等的。

在实践中,框架进行了优化,以便除非在需要时不调用它,但是您不应该将对build()的过多调用视为失败。


0
投票

你犯了几个错误,这是正确的代码。您应该使用String而不是Text小部件来显示响应。

class _Reports extends State<Reports> {
  static String url = "url";
  String _response = "abc";
  @override
  void initState() {
    super.initState();
    getTradeName_dropdown_ITR_Computation_DATA();
  }

  @override
  Widget build(BuildContext context) {

    print('body');

    return Scaffold(
      body: Container(
        child: new Text(_response),
      ),
    );
  }

  Future getTradeName_dropdown_ITR_Computation_DATA() async {
    try {
      http.Response response =
      await http.get("url_goes_here");

      if (this.mounted) {
        setState(() {
          String jsonTradeName_dropdown = response.body;
          _response = jsonTradeName_dropdown;
        });
      }
    } on Exception {
      setState(() {
        _response = "Some error occored. Please Try again...";
      });
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.