Search code examples
flutterfunctiondartreturn-value

Dart Function Returning Set<bool> Instead of bool


I'm building a mobile client for a blog with a paid CMS that shows a number of articles all the time, plus a rotating article each week, and I've built a simple function to get the current week of the year and return a Boolean value if an article should be displayed this week:

 bool displayArticle(StoredArticle article){
    if (article.week < 0) {
      return true;
    }

    DateTime now = DateTime.now();
    DateTime janFirst = DateTime(now.year, 1, 1);

    int weekNum = (now.difference(janFirst).inDays / 7).ceil();
    if(article.week == weekNum || article.week == (weekNum - 1)){
      return  true;
    }

    return false;
  }

I then use this function to filter a list of all the articles like so:

List<StoredArticle> articlessToDisplay = storedArticleObjs.where((article) => {
        displayArticle(article)
      }).toList();

This is all enclosed within a Stateful Widget.

However, using the function like this throws an error at the function call that The return type 'Set<bool>' isn't a 'bool', as required by the closure's context.

My first thought was that there was an issue with the displayArticle() function being a static member function to a stateful widget, but moving the function directly into the closure as follows did not impact the error.

List<StoredArticle> articlessToDisplay = storedArticleObjs.where((article) => {
        if (article.week < 0) {
      return true;
    }

    DateTime now = DateTime.now();
    DateTime janFirst = DateTime(now.year, 1, 1);

    int weekNum = (now.difference(janFirst).inDays / 7).ceil();
    if(article.week == weekNum || article.week == (weekNum - 1)){
      return  true;
    }

    return false;
      }).toList();

Next I thought it might be that the early return was confusing the inspector to belive it was returning multiple values, so I converted it to a single return function as follows, but that did nothing either.

 bool displayArticle(StoredArticle article){
    bool shouldDisplay = false;
    if (article.week < 0) {
      shouldDisplay = true;
    }

    DateTime now = DateTime.now();
    DateTime janFirst = DateTime(now.year, 1, 1);

    int weekNum = (now.difference(janFirst).inDays / 7).ceil();
    if(article.week == weekNum || article.week == (weekNum - 1)){
      shouldDisplay = true;
    }

    return shouldDisplay;

The only resources on similar issues have been referring to functions that return Future<T> instead of T. Putting aside the fact that my issue is with a Set<T> rather than a Future<T>, those errors have all been thrown by the return statement or the function definition rather than the function call.

I haven't been able to find any resources relating to this specific issue, though as I'm new to Flutter and Dart I suppose could be missing some specific terminology.

That being said, returning a set of the return type does not make any sense to me. Is this a quirk of implementation in a Stateful Widget?


Solution

  • The problem is that you have a few too many braces, and {"A"} is set-syntax in Dart.

    You have:

    storedArticleObjs.where((article) => {
            displayArticle(article)
          }).
    

    Change that to:

    storedArticleObjs.where((article) => 
            displayArticle(article)
          ).
    

    Note that the => function syntax doesn't use braces.

    You could even probably write it more compactly using tear-offs like so:

    storedArticleObjs.where(displayArticle).