颤振 - 当状态发生变化时,如何防止变量重新初始化?

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

我有一个带状态子项的TabBarView,每次选项卡更改时,子窗口小部件都会重新初始化并重置所有变量。

子节点基本上是一个自定义小部件,它使用Future从HTTP请求加载数据。完成后,我想缓存响应,这样当用户返回选项卡时,它不必再次通过HTTP加载数据。但是,如果我将HTTP数据存储在有状态窗口小部件中,则当选项卡更改时,它会重新初始化为null(因此我必须再次加载它)。

如何防止颤动重新初始化我的标签内容小部件?

variables dart flutter
1个回答
0
投票

你能创建Future,它从父级别的HTTP加载数据(一级到TabBarView)并将其发送到TabBarView。因此,它不会加载每个选项卡更改。

小代码示例:

import 'dart:async';

import 'package:flutter/material.dart';

void main() {
  runApp(TabBarDemo());
}

class TabBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Future<int> data = dataFromNetwork();
    return MaterialApp(
      home: DefaultTabController(
        length: 3,
        child: Scaffold(
          appBar: AppBar(
            bottom: TabBar(
              tabs: [
                Tab(icon: Icon(Icons.directions_car)),
                Tab(icon: Icon(Icons.directions_transit)),
              ],
            ),
            title: Text('Tabs Demo'),
          ),
          body: TabBarView(
            children: [
              new Page(data), // I am sending the same data for example purpose
              new Page(data),
            ],
          ),
        ),
      ),
    );
  }

  Future<int> dataFromNetwork() {
    return Future.delayed(Duration(seconds: 5), () {return 1;});
  }

}

class Page extends StatefulWidget {
  final Future<int> data;

  Page(this.data);

  @override
  State<StatefulWidget> createState() {
    return PageState(data);
  }
}

class PageState extends State<Page> {
  Future<int> data;

  PageState(this.data);

  @override
  Widget build(BuildContext context) {
    data.then((value) {
      print(value);
    });
    return Text("hi");
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.