颤动的 TabBarView 有时不会在手势滑动时触发

Posted

技术标签:

【中文标题】颤动的 TabBarView 有时不会在手势滑动时触发【英文标题】:flutter TabBarView sometimes not triggering on gesture swipe 【发布时间】:2021-01-01 15:12:30 【问题描述】:

我正在使用 Flutter -android 工作室。我的主屏幕带有 TabBarView 控件(2 页)。每个页面都从 sqfit 数据库中获取数据。两者都有相同的 statefull 小部件类,但我传递参数来查看数据库并显示。 问题:当我单击标签栏标题时,显示的数据正常。但是当我滑动标签时,它有时会起作用,有时会不起作用。按照下面的视频。我已经检查过,如果 Swipe 完成,似乎不会触发 Build 事件。 带有 tabbarview 的主小部件

screen record

请注意,第一个选项卡只有 1 条记录,而第二个选项卡有 6 条记录。 tabClick 可以正常工作,但有时滑动无法正常工作。

body: TabBarView(
    controller: _tabController,
    children: [
      DisplayTransactions(
        tmptransType: TransactionType.enIncome,
        transacBloc: _transacBloc,
        SelectedItemsCount: bRowSelectionCount,
        onSelectionChanged: (count) 
          setState(() 
            bRowSelectionCount = count;
          );
        ,
      ),
      // Center(child: Text("Page 1")),
      DisplayTransactions(
        tmptransType: TransactionType.enExpense,
        transacBloc: _transacBloc,
        SelectedItemsCount: bRowSelectionCount,
        onSelectionChanged: (count) 
          setState(() 
            bRowSelectionCount = count;
          );
        ,
        //Center(child: Text("Page 2")),
      )
    ],
  ),

-----> 小部件将数据显示到每个标签栏页面的列表视图中

class DisplayTransactions extends StatefulWidget 
final TransactionType tmptransType;
final FinanceTransBlock transacBloc;
final Function onSelectionChanged;
int SelectedItemsCount;

/// -1 expense  1 income
DisplayTransactions(
Key key,
@required this.tmptransType,
@required this.transacBloc,
this.SelectedItemsCount,
this.onSelectionChanged)
: super(key: key);

@override
_DisplayTransactionsState createState() => _DisplayTransactionsState();


class _DisplayTransactionsState extends State<DisplayTransactions> 
var isSelected = false;
var mycolor = Colors.white;

// int iselectionCount = 0;


@override
Widget build(BuildContext context) 
widget.transacBloc.transacType = widget.tmptransType;
debugPrint("----------------------------- $widget.tmptransType");
if (widget.SelectedItemsCount == 0) // if no rows selected, then reload database based on trans type, eg expense, or income.. etc
widget.transacBloc.refresh();


return StreamBuilder<List<FinanceTransaction>>(
stream: widget.transacBloc.transacations,
builder: (context, snapshot) 
if (snapshot.hasData) 
List<FinanceTransaction> list = snapshot.data;
// return  buildTaskListWal(snapshot.data);
return Padding(

【问题讨论】:

【参考方案1】:

该应用似乎需要一些时间来检索新数据。尝试在 snapshot.data 上检查 null 并显示一个 circularProgressIndicator。

if (snapshot.data == null) 
  return CirgularProgressIndicator();
  else 
//display data

【讨论】:

这一步我已经在做这一步了>>>> if (snapshot.hasData) else return Center( child: CircularProgressIndicator(), ); hasData 有点没用。它可以设置为 true,即使 data 属性还没有数据。我已经遇到过很多次了,现在我总是检查 snapshot.data == null ||快照.data.length == 0. 不工作。我用 if (snapshot.data == null || snapshot.data.length == 0) >> 不工作。 我注意到奇怪的事情,构建小部件没有被触发。我在 _DisplayTransactionsState extends State .. 类中放置了一个 debugPrint,我注意到了 android studio RUN 窗口。每次滑动 >> 时都不会触发 debugPrint 文本,因此不会触发 Build 小部件。这就是为什么不更新数据的原因。问题:为什么在点击滑动时不调用 DisplayTransaction? .. 这个检查是在下面的代码中完成的 debugPrint("----------------------------- $widget.tmptransType "); 如果您在两次滑动之间等待一秒钟,它会正确显示吗?

以上是关于颤动的 TabBarView 有时不会在手势滑动时触发的主要内容,如果未能解决你的问题,请参考以下文章

在 webview 中颤动水平滑动手势

如何在颤动的 TabBarView 中添加列表

如何在具有颤动的可滚动视图中使用具有可变高度内容的TabView?

向左或向右滑动时,我的卡片视图不会总是消失?

如何使用颤动在按钮网格中滑动/拖动 2 个或更多按钮

在颤动中使用按钮手势旋转文本或图像