Flutter — Twitter API — твиты не в правильном порядке

#api #flutter #dart #twitter

#API #флаттер #dart #Twitter

Вопрос:

В настоящее время я нахожусь в процессе программирования приложения на Flutter, в котором я также буду интегрировать канал Twitter с API Twitter. Я использую плагин

 twitter_api: ^ 0.1.2
  

для запроса API twitter. В твитах я также включаю предварительный просмотр ссылок в свое приложение через отдельный API на моем виртуальном сервере. В настоящее время у меня проблема в том, что твиты отображаются в неправильном порядке. я предполагаю, что это связано с тем, что http-запросы для предварительного просмотра ссылок занимают разное время, и поэтому возникает проблема, заключающаяся в том, что виджеты, которые создаются первыми, отображаются первыми. Я уже пытался замедлить цикл с

 await Future.delay(Duration(seconds: 1));
  

но, к сожалению, это тоже не сработало. Я был бы очень благодарен за любые советы. вот мой исходный код для ленты Twitter:

 void getTwitterFeed(String userID) async {
    Future twitterUserRequest = _twitterOauth.getTwitterRequest(
        "GET",
        "users/show.json",
        options: {
          "user_id": userID,
        }
    );

    var userRes = await twitterUserRequest;
    var user = json.decode(userRes.body);

    String profileIMGTMP = user["profile_image_url_https"];
    String profileIMGTmp = profileIMGTMP.replaceAll('_normal', '');

    User tmpUser = new User(name: user['name'], screeName: '@'   user['screen_name'], profileImageURL: profileIMGTmp);

    Future twitterFeedRequest = _twitterOauth.getTwitterRequest(
        "GET",
        "statuses/user_timeline.json",
        options: {
          "user_id": "18641554",
          "trim_user": "false",
          "tweet_mode": "extended",
          "count": "20",
        }
    );

    var feedRes = await twitterFeedRequest;
    var profile = json.decode(feedRes.body);

    List<Tweet> tmpTweetList = [];

    for (var tweet in profile) {
      URLS tmpURLS = new URLS(tweet["entities"]["urls"][0]["url"], tweet["entities"]["urls"][0]["expanded_url"], tweet["entities"]["urls"][0]["display_url"],);
      Tweet tmpTweet = new Tweet(user: tweet["user"]["id_str"], createdAt: tweet["created_at"], timeAgo: timeago.format(parseDateTime(tweet["created_at"]), locale: 'de'), fullText: tweet["full_text"], urls: tmpURLS);

      tmpTweetList.add(tmpTweet);
    }

    List<Widget> tmpTweetWidgetList = [];

    tmpTweetList.forEach((t) async {
      await Future.delayed(Duration(seconds: 3));
      String tmpFullText = t.fullText.replaceAll(t.urls.url, '');

      var metaRequest = await http.get('https://api.aw96.de/dbna/?url='   t.urls.url);
      var metaResponse = json.decode(metaRequest.body);

      String image = metaResponse['image'];

      if (image.isEmpty) {
        setState(() {
          image = 'https://icon-library.com/images/no-image-available-icon/no-image-available-icon-6.jpg';
        });
      }

      tmpTweetWidgetList.add(
        Padding(
          padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 10.0),
          child: Container(
            width: MediaQuery.of(context).size.width,
            decoration: BoxDecoration(
              color: Colors.transparent,
              border: Border.all(color: Color.fromRGBO(104, 114, 124, 1)),
              borderRadius: BorderRadius.circular(8.0),
            ),
            child: Padding(
              padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 15.0),
              child: Column(
                mainAxisAlignment: MainAxisAlignment.start,
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Row(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: <Widget>[
                      ClipRRect(
                        borderRadius: BorderRadius.circular(50),
                        child: Image.network(
                          tmpUser.profileImageURL,
                          width: 35,
                          height: 35,
                        ),
                      ),
                      SizedBox(
                        width: 10.0,
                      ),
                      Text(
                        tmpUser.name,
                        style: TextStyle(
                          color: Colors.white,
                          fontWeight: FontWeight.bold,
                          fontSize: 18.0,
                        ),
                      ),
                      SizedBox(
                        width: 10.0,
                      ),
                      Text(
                        tmpUser.screeName,
                        style: TextStyle(
                          color: Color.fromRGBO(104, 114, 124, 1),
                          fontWeight: FontWeight.bold,
                          fontSize: 14.0,
                        ),
                      ),
                      SizedBox(
                        width: 10.0,
                      ),
                      Text(
                        t.timeAgo,
                        style: TextStyle(
                          color: Color.fromRGBO(104, 114, 124, 1),
                          fontWeight: FontWeight.bold,
                          fontSize: 14.0,
                        ),
                      ),
                    ],
                  ),
                  Padding(
                    padding: EdgeInsets.only(top: 15, left: 48, bottom: 10),
                    child: Column(
                      children: [
                        Text(
                          tmpFullText,
                          style: TextStyle(
                            color: Colors.white,
                            fontSize: 18,
                          ),
                        ),
                        SizedBox(
                          height: 15.0,
                        ),
                        Container(
                          child: GestureDetector(
                            onTap: () async {
                              await launch(t.urls.url);
                            },
                            child: Container(
                              decoration: BoxDecoration(
                                border: Border.all(color: Color.fromRGBO(104, 114, 124, 1)),
                                borderRadius: BorderRadius.circular(8.0),
                              ),
                              child: Column(
                                children: [
                                  Image.network(
                                    image
                                  ),
                                  Padding(
                                    padding: EdgeInsets.symmetric(horizontal: 10.0, vertical: 15.0),
                                    child: Text(
                                      metaResponse['title'],
                                      style: TextStyle(
                                        color: Colors.white,
                                        fontSize: 18,
                                      ),
                                    ),
                                  ),
                                ],
                              ),
                            ),
                          ),
                        ),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
        ),
      );
    });
    setState(() {
      tweets = tmpTweetWidgetList;
    });
  }
  

Надеюсь, вы сможете мне в этом помочь. С наилучшими пожеланиями из Германии