- class Algo extends StatefulWidget {
- @override
- _AlgoState createState() => _AlgoState();
- }
- class _AlgoState extends State<Algo> {
- // declarando a variável Future
- Future<String> x;
- @override
- void initState() {
- // inicializando o objeto da classe Future no initState
- // que é chamado apenas quando o Widget entra pela primeira vez na árvore de widgets
- x = facaAlgo();
- super.initState();
- }
- Future<String> facaAlgo() async {
- return “algo”;
- }
- @override
- Widget build(BuildContext context) {
- return Container(
- child: FutureBuilder(
- // quando você passa a Future para o widget, quando o FutureBuilder for reconstruído,
- // ele vai TESTAR se esse objeto da classe Future é o mesmo de antes dele ser reconstruído,
- // se forem diferentes, ele vai re chamar a Future
- // nesse caso, ele Não vai refazer a chamada, porque o objeto já foi criado no initState e sempre será o mesmo
- future: x,
- // nesse caso, ele vai refazer a chamada, porque toda vez que a função facaAlgo é chamada, ela retorna um novo objeto
- // da classe Future
- // future: facaAlgo(),
- builder: (ctx, snapshot) {
- if (!snapshot.hasData)
- return Center(
- child: CircularProgressIndicator(),
- );
- return Center(
- child: Text(” fiz : ${snapshot.data}”),
- );
- },
- ),
- );
- }
- }
O código acima simplifica o problema. O builder tende a carregar seus métodos dentro do que é future, logo, quando você acessa algo em seu app e o setState() gira dentro do Future, ele vai rodar novamente seu método, o que consequentemente vai acessar urls sem sua autorização. A saída é exatamente essa relatada acima como exemplo.
Fonte? https://forum.flutterando.com.br/d/61-futurebuilder-fazendo-requests-em-segundo-plano-durante-a-navega-o-do-app