“此函数的返回类型为'Widget',但不以return语句结尾。”

时间:2019-11-01 17:13:15

标签: flutter dart

@override
Widget build(BuildContext context) {
  return StreamBuilder(
    stream: slides,
    initialData: [],
    builder: (context, AsyncSnapshot snap) {
      List slideList = snap.data.toList();
      return PageView.builder(
          controller: ctrl,
          itemCount: slideList.length + 1,
          itemBuilder: (context, int currentIdx){
            if (currentIdx == 0) {
              return _buildTagPage();
            }
            else if (slideList.length >= currentIdx){
              bool active = currentIdx == currentPage;
              return _buildStoryPage(slideList[currentIdx - 1], active);
            }
          }
      );
    },
  );
}

这是Reflectly应用程序克隆的摘录,我在(context, int currentIdx) {中遇到错误。

我假设我必须在某处添加return语句,但是不知道在哪里做。

2 个答案:

答案 0 :(得分:0)

如果两个都是假的,则必须在两个if语句之后添加return语句:

            itemBuilder: (context, int currentIdx){
              if (currentIdx == 0) {
                return _buildTagPage();
              } 
              else if (slideList.length >= currentIdx){
                bool active = currentIdx == currentPage;
                return _buildStoryPage(slideList[currentIdx - 1], active);
              }

              return [some_widget]; // <---- here
            }

答案 1 :(得分:0)

这里的问题是if-else if组合不是穷举的,这意味着在某些情况下,两个条件都不满足,因此都不满足的代码块被执行。

但是,itemBuilder指定需要从回调中返回Widget。因此,您会看到错误。

要解决此问题,您可以添加else语句以使if-else组合穷尽并从两者中返回,也可以添加return最后,如果之前没有返回任何内容,则总是可以达到的;

    controller: ctrl,
    itemCount: slideList.length + 1,
    itemBuilder: (context, int currentIdx){
      if (currentIdx == 0) {
        return _buildTagPage();
      } else if (slideList.length >= currentIdx) {
        bool active = currentIdx == currentPage;
        return _buildStoryPage(slideList[currentIdx - 1], active);
      }

      return Text('No slide availabe.');
    }
);

如您所见,我在最后添加了一个return语句,它将向用户显示一条消息。