我想创建一个新闻应用,并且我也使用了newsapi.org,但是
问题实际上是我想在自己的
中添加类似搜索功能的功能app,我的想法很简单。
我已经在AppBar中创建了一个TextField,我的想法是从中获取输入
user和setState以及新的用户输入网址。
我的代码:
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);
}
}
}