flutter - Flutter标签-即使未显示标签,也会创建一个标签

标签 flutter dart

我有一个DefaultTabController,其中包含TabBarViewTabController,到目前为止没有什么特别的。

我有1个选项卡,它需要在服务器初始化后立即向服务器发出请求,我们称其为“探索”选项卡。

如果尚未初始化请求,我将使用didChangeDependencies发出请求(我有一个用于初始化的 bool(boolean) 标志)。

确实,每次创建选项卡的小部件时都会发出请求,但是存在一个问题。

假设有3个标签,而“探索”标签是介于1和3之间的第二个标签。

当从选项卡1转到选项卡3或从选项卡3转到选项卡1时,似乎浏览选项卡是在过渡期间创建的(即使它根本没有显示),因此向服务器发出了请求。

我想避免这种情况,仅在用户专门转到浏览选项卡时才在浏览选项卡的didChangeDependencies中发出该请求。

有任何想法吗?

最佳答案

好,所以,您有3个标签

[tab1],[tab2],[tab3]

仅在按下[tab2]时才希望触发事件(请求服务器)的地方。

为此,创建一个tabController隔离以在StateFull小部件中添加事件侦听器,例如:

  TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(
      length: 2,
      vsync: this,
    );
    _tabController.addListener(() {
      if (_tabController.indexIsChanging == false) {
        if(_tabController.index == 1) { 
          //Trigger your request
        }
      }
    });
  }

注意:indexIsChanging == false是为了确保选项卡已经完成了该 Controller 的currentIndex更改工作,下面是完整示例:
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BodyWidget(),
    );
  }
}

class BodyWidget extends StatefulWidget {
  @override
  BodyWidgetState createState() {
    return new BodyWidgetState();
  }
}

class BodyWidgetState extends State<BodyWidget>
    with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void initState() {
    super.initState();
    _tabController = TabController(
      length: 3,
      vsync: this,
    );
    _tabController.addListener(() {
      if (_tabController.indexIsChanging == false) {
        if (_tabController.index == 1) {
          //Trigger your request
          print('Triger 2 selected, do the http call now.');
        }
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('test'),
        bottom: TabBar(
          controller: _tabController,
          tabs: <Widget>[
            Tab(text: 'Tab 1'),
            Tab(text: 'Tab 2'),
            Tab(text: 'Tab 3'),
          ],
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: <Widget>[
          Container(child: Center(child: Text('tab1'))),
          Container(child: Center(child: Text('tab2'))),
          Container(child: Center(child: Text('tab3'))),
        ],
      ),
    );
  }
}

关于flutter - Flutter标签-即使未显示标签,也会创建一个标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60330303/

相关文章:

flutter - 使用 Flutter 和 Stripe 支付成功后返回应用

firebase - 在 flutter 项目中替换 firebase json 的 Github Action

flutter - 如何将TextField标签文本和图标移到右侧

flutter - 我迁移到空安全,我不能在没有抛出错误的情况下运行 "flutter pub run build_runner build"

flutter - MethodChannel 的后台监听器

flutter - 如何在 flutter 中制作这样的自定义应用程序栏?

flutter - 我们如何使用Flutter中的底部导航栏触发有状态的小部件来进行导航自身的重建?

ios - 如何上传Flutter开发的dsyms文件?

flutter 使容器大小适合堆栈大小

android - Flutter ListView 不滚动到最后添加的项目,而是滚动到最后一个之前的项目