Как установить состояние http URL? - PullRequest
1 голос
/ 05 ноября 2019

Я хочу создать новостное приложение, и я также использовал newsapi.org, но проблема

в том, что я хочу сделать что-то похожее на функцию поиска в моем приложении

имоя идея очень проста.

Я создал TextField в AppBar, и моя идея состоит в том, чтобы взять ввод от

user и setState с новым URL-адресом пользовательского ввода.

Мой код:

import 'package:flutter/material.dart';
import 'package:newly/services/networking.dart';
import 'package:newly/widgets/article.dart';

class NewsScreen extends StatefulWidget {
  @override
  _NewsScreenState createState() => _NewsScreenState();
}

class _NewsScreenState extends State<NewsScreen> {
  List<Article> articles = [];

  String topic = 'google';

  var newsData;

  Future getNews(String topic) async {
    NetworkHelper networkHelper = NetworkHelper(
      url:
          'https://newsapi.org/v2/everything?q=$topic&from=2019-11-04&to=2019-11-04&sortBy=popularity&apiKey=392495172bab4b3885ae93760df54b91',
    );

    newsData = await networkHelper.getData();

    for (int i = 0; i < newsData['articles'].length; i++) {
      var title =  newsData['articles'][i]['title'];
      var urlToImage =  newsData['articles'][i]['urlToImage'];
      var content =  newsData['articles'][i]['content'];
      var author =  newsData['articles'][i]['author'];
      var url =  newsData['articles'][i]['url'];
      setState(() {
        articles.add(
          Article(
            author: author,
            content: content,
            title: title,
            url: url,
            urlToImage: urlToImage,
          ),
        );
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.black,
        centerTitle: true,
        title: TextField(
          textInputAction: TextInputAction.search,
          onChanged: (String text) async {
            setState(() {
              topic = text;
            });
            await getNews(topic);
            print(topic);
          },
          onSubmitted: (String text) async {
            setState(() {
              topic = text;
            });
            print(topic);
            await getNews(topic);
          },
          decoration: InputDecoration(
            suffixIcon: IconButton(
              onPressed: () async {
                await getNews(topic);
                print(topic);
              },
              icon: Icon(
                Icons.search,
              ),
            ),
            hintText: 'Search',
            filled: true,
            fillColor: Colors.white,
          ),
        ),
      ),
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(15.0),
          child: FutureBuilder(
            future: getNews(topic),
            builder: (context, snapshot) {
              return ListView.builder(
                itemCount: newsData['articles'] == null
                    ? 0
                    : newsData['articles'].length,
                itemBuilder: (BuildContext ctxt, int index) {
                  return Article(
                    author: articles[index].author,
                    content: articles[index].content,
                    title: articles[index].title,
                    url: articles[index].url,
                    urlToImage: articles[index].urlToImage,
                  );
                },
              );
            },
          ),
        ),
      ),
    );
  }
}

Помощник по сети:

import 'package:http/http.dart' as http;
import 'dart:convert';

class NetworkHelper {
  NetworkHelper({this.url});

  final String url;

  Future getData() async {
    http.Response response = await http.get(url);

    if (response.statusCode == 200) {
      String data = response.body;

      return json.decode(data);
    } else {
      print('something wrong');
      print(response.statusCode);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...