dart 如果Future List返回空,如何更改选项卡栏上的选项卡

zpgglvta  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(98)

我有一个TabBar与2标签(服务和教练).我用2个Future列表填充这个选项卡(在每个选项卡上使用FutureBuilders)。我想做的是:当第一个Future完成并且List为空时,我希望选项卡栏动画到第二个选项卡(索引为1的选项卡)。我如何才能做到这一点?

final List<Widget> _tabs = [
const Tab(text: 'Servicios'),
const Tab(text: 'Profesionales'), 
];

TabBar(
  isScrollable: false,
  controller: _tabController,
  tabs: _tabs,
),

TabBarView(
  controller: _tabController,
  children: [
     // TAB 0
     FutureBuilder<List<ServiceCardCommonWidget>>(
       future: widget.futureServices,
       builder: (context, snapshot) {
         // if snapshot.data.isEmpty I want to animate to the tab with index 1
       } 
     ),
     // TAB 1
     FutureBuilder<List<CoachCardCommonWidget>>(
        future: widget.futureCoaches,
        builder: (context, snapshot) { 
           // Content of Tab 1  
        },
    ),
],

),

sc4hvdpw

sc4hvdpw1#

不应该在build方法中设置动画。如文档中所述,
未来必须是更早获得的,例如。在State.initStateState.didUpdateWidgetState.didChangeDependencies期间。在构造FutureBuilder时,不能在State.buildStatelessWidget.build方法调用期间创建它。如果future与FutureBuilder同时创建,则每次重建FutureBuilder的父任务时,异步任务都将重新启动。
您可以在initState中检查Future的结果,并将其设置为所需的Tab。

final List<Widget> _tabs = [
    const Tab(text: 'Servicios'),
    const Tab(text: 'Profesionales'),
  ];

  late Future<List<String>> getServices;
  late Future<List<String>> getProfessions;

  late TabController _tabController;

  @override
  void initState() {
    _tabController = TabController(length: _tabs.length, vsync: this);

    getServices = Future.delayed(const Duration(seconds: 1), () {
      final r = math.Random().nextBool();
      return r ? ['S1', 'S2', 'S3'] : [];
    })
      ..then((value) => value.isEmpty ? _tabController.animateTo(1) : null);

    getProfessions =
        Future.delayed(const Duration(seconds: 1), () => ['P1', 'P2', 'P3']);
    super.initState();
  }

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

相关问题