微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重新启动时颤动应用程序在热重新加载后不显示主页它可以工作

如何解决重新启动时颤动应用程序在热重新加载后不显示主页它可以工作

我是 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?