如何解决如何在颤振中使用提供者
如何在Flutter中使用provider....
http: ^0.13.1
provider: ^5.0.0
http 测试通过
import 'package:Flutter/material.dart';
import 'package:Flutter_movie/src/Home.dart';
import 'package:Flutter_movie/src/movie_info.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<MovieInfo>(create: (_) => MovieInfo()),],child: MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,),home: Home(),);
}
}
import 'package:Flutter/material.dart';
import 'package:Flutter_movie/model/movies.dart';
import 'package:Flutter_movie/selectPage.dart';
import 'package:Flutter_movie/src/movie_info.dart';
import 'package:provider/provider.dart';
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
Future<Movies> data;
MovieInfo movieInfo;
@override
void initState() {
super.initState();
Provider.of<MovieInfo>(context,listen: false).fetchData();
}
@override
Widget build(BuildContext context) {
MovieInfo movieInfo = Provider.of<MovieInfo>(context);
Movies result = movieInfo.result;
return Scaffold(
drawer: Drawer(
child: Container(
color: Colors.blueGrey,child: ListView(
padding: EdgeInsets.only(top: 0.0),children: <Widget>[
ListTile(
title: Text('Dashboard'),ListTile(
title: Text('Submit Reports'),ListTile(
title: Text('InBox Requests'),appBar: AppBar(
title: Text('영화 정보 검색기'),backgroundColor: Colors.blueGrey,leading: IconButton(icon: Icon(Icons.menu),onpressed: () {}),actions: <Widget>[
// IconButton(icon: Icon(Icons.search),IconButton(icon: Icon(Icons.help),bottom: PreferredSize(
child: Padding(
padding: const EdgeInsets.fromLTRB(0.0,0.0,10.0,16.0),child: Container(
margin: EdgeInsets.only(left: 16.0),preferredSize: Size(0.0,30.0),body: Scaffold(
backgroundColor: Colors.blueGrey,body: Column(
children: <Widget>[
TextField(
controller: movieInfo.myController,onChanged: (text) {
setState(() {
movieInfo.filteredItems.clear();
movieInfo.filteredItems.addAll(result.results
.where((item) => item.title.contains(text)));
});
},decoration: Inputdecoration(
filled: true,fillColor: Colors.white,border: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.white),borderRadius: BorderRadius.circular(40)),labelText: '검색',Expanded(
child: GridView.count(
crossAxisCount: 3,childAspectRatio: 2 / 3.5,children: result == null ? [] : _buildShow(),);
}
Widget _buildItem(Results movies) {
return InkWell(
child: Card(
color: Colors.blueGrey,margin: EdgeInsets.symmetric(vertical: 5.0,horizontal: 10.0),child: Column(
children: [
Image.network('https://image.tmdb.org/t/p/w500/${movies.posterPath}'),Text('${movies.title}',style: TextStyle(height: 1.5,fontSize: 15,fontWeight: FontWeight.bold),onTap: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DetailScreen(movie: movies),);
},);
}
List<Widget> _buildShow() {
if (movieInfo.myController.text.isEmpty) {
return movieInfo.result.results.map((movies) => _buildItem(movies)).toList();
}
return movieInfo.filteredItems.map((e) => _buildItem(e)).toList();
}
}
出事了.... 首先看不到电影列表..
import 'package:Flutter/material.dart';
import 'package:Flutter_movie/model/movies.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;
class MovieInfo extends ChangeNotifier {
Movies _result;
Movies get result => _result;
final myController = TextEditingController();
final List<Results> filteredItems = [];
Future<Movies> fetchData() async {
var url = Uri.parse(
'https://api.themoviedb.org/3/movie/upcoming?api_key=&language=ko-KR&page=1');
var response = await http.get(url);
Movies result = Movies.fromJson(json.decode(response.body));
notifyListeners();
return result;
}
}
在我放置提供程序之前,运行良好 但是,当我尝试将 put provider 放入第一页时无法看到列表,当我尝试将文本放入文本文件中时,它说结果为空....
在杰森
{
"dates": {
"maximum": "2021-05-24","minimum": "2021-05-07"
},"page": 1,"results": [
{
"adult": false,"backdrop_path": "","genre_ids": [
14,28,12,878,53
],"id": 460465,"original_language": "en","original_title": "","overview": "","popularity": 6983.02,"poster_path": "","release_date": "2021-04-07","title": "모탈 컴뱃","video": false,"Vote_average": 7.9,"Vote_count": 1810
},
想要在结果中使用数据..
解决方法
class MovieInfo extends ChangeNotifier {
Movies _result;
Movies get result => _result;
final myController = TextEditingController();
final List<Results> filteredItems = [];
Future<void> fetchData() async {
var url = Uri.parse(
'https://api.themoviedb.org/3/movie/upcoming?api_key=&language=ko-KR&page=1');
var response = await http.get(url);
Movies result = Movies.fromJson(json.decode(response.body));
this.result = result;
notifyListeners();
}
}
然后访问结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。