如何解决重新启动时颤动应用程序在热重新加载后不显示主页它可以工作
我是 Flutter 应用程序开发的初学者。我正在尝试使用 for 循环从 api 中获取超过 10 个页面,并且 addall 结果在列表中。为此,我创建了 future 函数和 statefulwidget 这是我的代码
import 'dart:convert';
import 'package:MovieAPi/infopage.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:Flutter/material.dart';
import 'package:http/http.dart' as http;
void main() {
runApp(MyApp());
}
List data = [];
Future<void> _getMovies() async {
for (var i = 1; i < 10; i++) {
var url =
"https://api.themoviedb.org/3/trending/movie/week?api_key=1dce78a9836cf6fbc01190431d9443fe&page=$i";
http.Response response = await http.get(url);
var JsonBody = json.decode(response.body);
data.addAll(JsonBody['results']);
}
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,theme: ThemeData(
primarySwatch: Colors.blue,textTheme: TextTheme(
title: TextStyle(
fontSize: 22,fontWeight: FontWeight.bold,),subtitle: TextStyle(fontSize: 18,fontWeight: FontWeight.w700),visualDensity: VisualDensity.adaptivePlatformDensity,home: MovieTile(),);
}
}
class MovieTile extends StatefulWidget {
@override
_MovieTileState createState() => _MovieTileState();
}
class _MovieTileState extends State<MovieTile> {
void initState() {
super.initState();
setState(() {
_getMovies();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Movies",style: Theme.of(context).textTheme.title),backgroundColor: Colors.white,bottomOpacity: 0.0,shadowColor: Colors.white,automaticallyImplyLeading: false,body: ListView.builder(
itemCount: data.length,itemBuilder: (context,index) {
String image = data[index]['poster_path'];
String title = data[index]['title'];
String release_date = data[index]['overview'];
String id = data[index]['id'].toString();
String Vote = data[index]['Vote_average'].toString();
return GestureDetector(
onTap: () {
return Navigator.push(context,MaterialPageRoute(builder: (context) => InfoMovie(id)));
},child: Padding(
padding:
const EdgeInsets.symmetric(vertical: 8.0,horizontal: 10),child: Container(
width: MediaQuery.of(context).size.width,height: 500.0,decoration: Boxdecoration(
borderRadius: BorderRadius.circular(20),image: decorationImage(
image: CachednetworkImageProvider(
"https://image.tmdb.org/t/p/original$image",fit: BoxFit.cover,BoxShadow: [
BoxShadow(
offset: Offset(1,9),blurRadius: 10,color: Colors.black26,)
],child: Stack(
children: [
Container(
decoration: Boxdecoration(
color: Colors.black26,borderRadius: BorderRadius.circular(20),Positioned(
bottom: 0,child: Container(
decoration: Boxdecoration(
color: Colors.black.withOpacity(0.5),borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(20),bottomright: Radius.circular(20),padding: EdgeInsets.all(20),width: MediaQuery.of(context).size.width * 0.95,child: Column(
crossAxisAlignment: CrossAxisAlignment.start,children: [
Text(
title,style: Theme.of(context)
.textTheme
.title
.copyWith(color: Colors.white),SizedBox(height: 5),Text(
release_date,style: Theme.of(context)
.textTheme
.subtitle
.copyWith(
color: Colors.white.withOpacity(0.9)),textAlign: TextAlign.left,maxLines: 3,overflow: TextOverflow.ellipsis,softWrap: true,],Positioned(
top: 20,left: 10,child: Container(
height: 50,width: 50,decoration: Boxdecoration(
shape: BoxShape.circle,border: Border.all(
color: Colors.white.withOpacity(0.6),width: 1)),child: Center(
child: Container(
height: 40,width: 40,decoration: Boxdecoration(
shape: BoxShape.circle,color: Colors.white,child: Center(
child: Text(
Vote,style: TextStyle(
fontWeight: FontWeight.bold,fontSize: 18,);
},));
}
}
当我打开应用程序时什么都不显示 like this 只有空白屏幕 当我热重载然后显示结果时 here
解决方法
首先,setState
中不需要 initState
。其次,由于 ListView.builder
是页面正文的根元素,您无法直接看到 data
内容,因为它在应用启动时为空 data = []
。
为了解决这个问题,你最好尝试这样的事情
return Scaffold(
body: data.length > 0 ? ListView.builder(
// ...
) : Center(
child: CircularProgressIndicator(),),)
此外,最好将 List data
变量和 _getMovies
函数放在 _MovieTileState
中
class _MovieTileState extends State<MovieTile> {
List data;
void initState() {
super.initState();
data = [];
_getMovies();
}
Future<void> _getMovies() async {
for (var i = 1; i < 10; i++) {
var url = "https://api.themoviedb.org/3/trending/movie/week?api_key=1dce78a9836cf6fbc01190431d9443fe&page=$i";
http.Response response = await http.get(url);
var JsonBody = json.decode(response.body);
setState(() {
data.addAll(JsonBody['results']);
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// ...
),body: data.length > 0 ? ListView.builder(
// ...
) : Center(
child: CircularProgressIndicator(),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。