如何使选项卡和选项卡栏视图在颤动中动态化,以便它能够响应来自 api 的响应?

Posted

技术标签:

【中文标题】如何使选项卡和选项卡栏视图在颤动中动态化,以便它能够响应来自 api 的响应?【英文标题】:How do I make a tab and tab bar view dynamic in flutter so that it will ha on the response from an api? 【发布时间】:2021-12-25 22:44:41 【问题描述】:

我正在尝试创建一个列表,将数据添加到列表基于 收到回复,但无法正常工作。

我尝试在添加之前遍历数据库以检查数据是否存在 到列表中。我好像做得不太好。

我的挑战是动态控制我添加到列表中的内容。以便它会根据它发生变化。

    Updated the codes.
      //Defualt tab controller
       DefaultTabController(
        length: tabs.length,
       child: Column(
          children: [
            Container(
              child: TabBar(
                labelColor: HexColor("#006E40"),
                unselectedLabelColor: Colors.black,
                indicatorColor: HexColor("#006E40"),
                indicatorWeight: 3,
                indicatorPadding: (EdgeInsets.symmetric(horizontal: 
                10.0)),
                isScrollable: true,
              //  controller: _tabController,
                tabs: tabs ), // tabs List 
            ),
            SizedBox(height: 15),
            Container(
              margin: const EdgeInsets.only(bottom: 20.0),
              height: MediaQuery
                  .of(context)
                  .size
                  .height * 0.8,
              child: Padding(
                padding: const EdgeInsets.only(bottom: 28.0),
                child: TabBarView(
                  children: tabsItems ), // Tab Bar List
              ),
 // Checking whether the item already exist then adding to the list 
 //  based on result
  Lsit<DatabaseItemsPastaSelf> databaseItemsPasta = [] 

  Future readPastaItems() async 
this.databaseItemsPasta = await 
  PastaDatabaseSelf.instance.readAllItems();
   for(int i = 0; i<databaseItemsPasta.length; i++)
    if (databaseItemsPasta.length != 0) 
     tabs.add(
      Padding(
        padding: const EdgeInsets.only(top: 20),
        child: Text(
          "Fruits",
          style: TextStyle(fontWeight: FontWeight.w700, fontSize: 
               14),
            ),
          ),
        );
        tabsItems.add(PastaAndNoodlesSelf());
        break;
        
      
      return databaseItemsPasta.length;
      

    List<DatabaseItemsSugarSelf> databaseItemsSugar = [];

    Future readSugarItems() async 
    this.databaseItemsSugar = await 
    SugarDatabaseSelf.instance.readAllItems();
     for(int i = 0; i<databaseItemsSugar.length; i++)
       if (databaseItemsSugar.length != 0) 
       tabs.add(
         Padding(
          padding: const EdgeInsets.only(top: 20),
           child: Text(
           "Foods",
            style: TextStyle(fontWeight: FontWeight.w700, fontSize: 
          14),
        ),
      ),
    );
     tabsItems.add(SugarSelf());
       break;
  
   
   return databaseItemsSugar.length;
    


   List<Widget> tabs = [];
  List<Widget> tabsItems = [];
  

      

【问题讨论】:

你试过list.map((item) =&gt; widget(item)).toList()这样的列表上的地图功能吗 【参考方案1】:

您可以使用 FutureBuilder、map 函数和状态管理,如下所示

FutureBuilder:监听获取数据状态。 map 函数:迭代抛出数据列表。 状态管理更新数据列表状态。

请更新

readPastaItems()

成为

var tabIndex = 0;
bool isLoadingData = false;

List<dynamic> databaseItemsPasta = [];


Future readPastaItems() async 
  isLoadingData = true;
  await PastaDatabaseSelf.instance.readAllItems().then((records) 
    this.databaseItemsPasta = records;
    isLoadingData = false;
  );

并更新

默认选项卡控制器

用 FutureBuilder 包装

FutureBuilder(
future: Future.delayed(Duration.zero, () => readPastaItems()),
builder: (context, snapshot) 

  if(isLoadingData) return CircularProgressIndicator();
  if(snapshot.hasError) return Text('error');
  if(!snapshot.hasData || this.databaseItemsPasta.isEmpty) return Text('no data');

  if(this.databaseItemsPasta.length > 0)  return DefaultTabController(
    length: databaseItemsPasta?.length ?? 0,
    initialIndex: tabIndex,
    child: Scaffold(
      appBar: AppBar(),
      body: TabBarView(
        physics: NeverScrollableScrollPhysics(),
        children: databaseItemsPasta.map((databaseItem) =>
            Padding(padding: const EdgeInsets.only(top: 12, bottom: 12), child: Text('$databaseItem.toString()')),
        ).toList(),
      ),
      bottomNavigationBar: TabBar(
        labelColor: Colors.black45,
        tabs: databaseItemsPasta.map((databaseItem) =>
            Padding(padding: const EdgeInsets.only(top: 12, bottom: 12), child: Text('$databaseItem.toString()')),
        ).toList(),
      ),
    ),
  );

  return SizedBox();

)

【讨论】:

以上是关于如何使选项卡和选项卡栏视图在颤动中动态化,以便它能够响应来自 api 的响应?的主要内容,如果未能解决你的问题,请参考以下文章

颤动中的 sliverpersistent 标题代表内部的不可见选项卡栏

如何在选项卡栏控制器中更新选项卡上的视图

Swift:如何使选项卡视图控制器按钮不显示?

如何快速隐藏嵌入在导航堆栈中的视图控制器中的选项卡栏?

如何在保留选项卡栏的同时将子视图控制器添加到选项卡式视图控制器?

如何以编程方式使用 Swift 3 在所有视图控制器中显示选项卡栏?