豆瓣电影列表

豆瓣影评
  • main.dart
void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return App();
  }
}
  • app.dart
class App extends StatelessWidget {
    @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return MaterialApp(
        home: MovieScreen(),
    );
  }
}
  • 网络请求
import 'package:dio/dio.dart';
import 'dart:convert';

class RequestManager {
  Dio dio;
  static RequestManager _requestManager;

  static RequestManager getInstance() {
    if (_requestManager == null) {
      _requestManager = RequestManager();
    }
    return _requestManager;
  }

  RequestManager() {
    dio = Dio();
    dio.options.connectTimeout = 5000; // 5s
    dio.options.receiveTimeout = 3000;
  }

  get(String url, Map<String, dynamic> params,
      {Function success, Function failure}) async {
    try {
      Response response;
      response = await dio.get(url, queryParameters: params);
      Map data = json.decode(response.toString());
      success(data);
    } catch (e) {
      print("RequestManager - e ${e}");
      failure(e);
    }
  }
}
  • model
class Movie {
    String title; // 名称
    String imageUrl; // 图片链接
    int commentCount; // 评论数
    double mark; // 评分
    String type; // 类型

    Movie.fromMap(Map<String,dynamic> json) {
        this.title = json["title"];
        this.imageUrl = json["images"]["small"];
        this.commentCount = json["collect_count"];
        this.mark = json["rating"]["average"];
        List genres = json["genres"];
        this.type = genres.join(" / ");
    }
}
  • movie 主页
class MovieScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("豆瓣影评"),
      ),
      body: MovieList(),
    );
  }
}

class MovieList extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MovieListState();
  }
}

class MovieListState extends State<MovieList> {

  List<Movie> movies = [];

  // 电影列表
  void getMoiveListData() {
    var url = "https://douban.uieee.com/v2/movie/top250";
    var params = {"start": "0", "count": "10"};
    RequestManager.getInstance().get(url, params,success: (value){

      setState(() {
        List subjects = value["subjects"];
        subjects.forEach((value) {
          movies.add(Movie.fromMap(value));
        });
      });

    },failure: (value){
      print("exceptaion- ${value}");
      print("failure");
    });
  }

  @override
  void initState() {
    super.initState();

    getMoiveListData();
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
            itemCount: movies.length,
            itemBuilder: (context,index) {
              return MoiveRow(movies[index]);
            },
    );
  }
}
  • row
class MoiveRow extends StatelessWidget {

    final Movie movie;

    MoiveRow(this.movie);

    // 电影排名
    Widget MovieRankWidget() {
        return Container(
            padding: EdgeInsets.fromLTRB(10.0, 5.0, 10.0, 5.0),
            decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(3.0),
                color: Colors.orange,
            ),
            child: Text("No.1",style: TextStyle(fontSize: 18.0,color: Colors.white),),
        );
    }

    // 具体内容
    Widget MovieContent() {
        return Container(
            height: 150,
            child: Row(
                children: <Widget>[
                    MovieIcon(),
                    MovieDescribe(),
                ],
            ),
        );
    }

    // 电影图片
    Widget MovieIcon() {
        return ClipRRect(
            borderRadius: BorderRadius.circular(5.0),
            child: Image.network(movie.imageUrl),
        );
    }

    // 描述
    Widget MovieDescribe() {
        return Expanded(
            child: Container(
                padding: EdgeInsets.only(left: 15),
                child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                        MovieTitle(),
                        Padding(padding: EdgeInsets.only(top: 5.0),),
                        MovieMark(),
                        Padding(padding: EdgeInsets.only(top: 5.0),),
                        MovieDetail(),
                    ],
                ),
            ),
        );
    }

    // 电影名称
    Widget MovieTitle() {
        return Text(
            "${movie.title}",
            style: TextStyle(fontSize: 20.0,color: Colors.black),
        );
    }

    // 评分
    Widget MovieMark() {
        return Text("豆瓣评分: ${movie.mark}",style: TextStyle(fontSize: 13.0,color: Colors.grey),);
    }

    // 具体详情
    Widget MovieDetail() {
        return Text(
            "${movie.type}",
            maxLines: 5,
            softWrap: true,
            style: TextStyle(fontSize: 16.0,color: Colors.grey),
        );
    }

    // 评价
    Widget MovieComment() {
        return Container(
            color: Colors.black12,
            height: 30.0,
            padding: EdgeInsets.all(5.0),
            child: Row(
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                    Text("${movie.commentCount}评价",style: TextStyle(fontSize: 15.0,color: Colors.blueGrey),)
                ],
            ),
        );
    }

    @override
    Widget build(BuildContext context) {
        return Container(
            padding: EdgeInsets.all(10.0),
            decoration: BoxDecoration( // 分割线
                    border: Border(bottom: BorderSide(width: 10, color: Colors.black12))
            ),
            child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                    // 排名
                    MovieRankWidget(),
                    Padding(padding: EdgeInsets.only(top: 10.0),),
                    // 具体内容
                    MovieContent(),
                    Padding(padding: EdgeInsets.only(top: 10.0),),
                    // 评价
                    MovieComment(),
                ],
            ),
        );
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • 随着Kotlin1.2.7版本发布Androidstudio3.2稳定版本发布,增加了更多的Kotlin支持,是时...
    Lazy1阅读 416评论 0 1
  • 1、首先解决上一章的两个缺陷,第一个是在MoviesBloc类里建立的dispose()方法来关闭streams以...
    渣渣曦阅读 513评论 1 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,089评论 1 32
  • 爷爷走了已经有3天了,所有人的悲伤好像都被很好的隐藏起来了,但是很多事情你不去想还好,一去想就控制不住心底的那份痛...
    为爱执笔阅读 319评论 0 0
  • 3月22,今天开始早起,11:30结束所有事情,睡觉。 也就意味着我每天回去要立即结束所有的琐碎事情,手机就不用看...
    鱿鱼儿阅读 165评论 1 0