Flutter电影数据库查询插件jp_moviedb的使用

Flutter电影数据库查询插件jp_moviedb的使用

一个用于查询电影数据库的Flutter插件,该插件作为The Movie Database (TMDB) API的封装。它简化了与TMDB的交互,并提供了访问各种端点的简单方法。

功能

该插件目前支持以下TMDB API端点:

  1. 发现电影
  2. 搜索人员
  3. 获取电影类型

安装

在你的pubspec.yaml文件中添加以下内容:

dependencies:
  jp_moviedb:
    git:
      url: https://github.com/jpDxsolo/moviedb.git

然后运行:

flutter pub get

使用

首先,导入插件:

import 'package:jp_moviedb/api.dart';
import 'package:jp_moviedb/filters/movie.dart';
import 'package:jp_moviedb/types/movie.dart';
import 'package:jp_moviedb/types/person.dart';
import 'package:jp_moviedb/types/genre.dart';

发现电影

要发现电影:

final TmdbApi api = TmdbApi('YOUR_API_KEY');
late Future<List<Movie>> movies;

[@override](/user/override)
void initState() {
  super.initState();
  MovieFilters filters = MovieFilters();
  filters.page = 10;
  filters.language = 'en';
  filters.primaryReleaseDateGte = DateTime(1980, 01, 01);
  filters.primaryReleaseDateLte = DateTime(1981, 01, 01);
  movies = api.discover.getMovies(filters);
}

搜索人员

要搜索人员:

late Future<List<Person>> persons;

[@override](/user/override)
void initState() {
  super.initState();
  persons = api.search.getPerson('Tom Hanks');
}

获取电影类型

要获取电影类型列表:

late Future<List<Genre>> genres;

[@override](/user/override)
void initState() {
  super.initState();
  genres = api.genres.getGenres();
}

示例代码

以下是一个完整的示例代码,展示了如何使用jp_moviedb插件来查询电影数据。

import 'package:flutter/material.dart';
import 'package:jp_moviedb/api.dart';
import 'package:jp_moviedb/filters/movie.dart';
import 'package:jp_moviedb/types/movie.dart';
import 'package:jp_moviedb/types/person.dart';
import 'package:jp_moviedb/types/genre.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '电影查询示例',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: '电影查询示例'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TmdbApi api = TmdbApi('YOUR_API_KEY');
  late Future<List<Movie>> movies;
  late Future<List<Person>> persons;
  late Future<List<Genre>> genres;

  [@override](/user/override)
  void initState() {
    super.initState();
    MovieFilters filters = MovieFilters();
    filters.page = 10;
    filters.language = 'en';
    filters.primaryReleaseDateGte = DateTime(1980, 01, 01);
    filters.primaryReleaseDateLte = DateTime(1981, 01, 01);
    movies = api.discover.getMovies(filters);
    persons = api.search.getPerson('Tom Hanks');
    genres = api.genres.getGenres();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('电影查询示例'),
      ),
      body: Center(
        child: FutureBuilder<List<Movie>>(
          future: movies,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                itemCount: snapshot.data!.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Column(
                      children: [
                        Row(
                          children: [
                            Text(snapshot.data![index].title),
                            Padding(
                              padding: const EdgeInsets.all(8.0),
                              child: Text(
                                  '上映日期 ${snapshot.data![index].releaseDate.year.toString()}-${snapshot.data![index].releaseDate.month.toString()}-${snapshot.data![index].releaseDate.day.toString()}'),
                            )
                          ],
                        ),
                        Text(snapshot.data![index].overview)
                      ],
                    ),
                    subtitle: Image.network(snapshot.data![index].posterPath),
                  );
                },
              );
            } else if (snapshot.hasError) {
              return Text('${snapshot.error}');
            }
            // 默认显示加载指示器。
            return const CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

更多关于Flutter电影数据库查询插件jp_moviedb的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电影数据库查询插件jp_moviedb的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用jp_moviedb插件来查询电影数据库的代码示例。这个插件通常用于从电影数据库(如The Movie Database, TMDb)中获取电影信息。不过,请注意,jp_moviedb可能不是官方或广泛使用的插件名称,这里我将展示一个类似功能的实现,通常你需要一个支持TMDb API的Flutter插件,比如flutter_movie_db(假设这是类似jp_moviedb的插件名称)。

首先,确保你已经在pubspec.yaml文件中添加了相应的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_movie_db: ^x.y.z  # 替换为实际版本号

然后,运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用这个插件来查询电影数据库。以下是一个基本的示例,展示如何获取并显示电影列表:

import 'package:flutter/material.dart';
import 'package:flutter_movie_db/flutter_movie_db.dart'; // 假设这是插件的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Movie DB Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MovieListScreen(),
    );
  }
}

class MovieListScreen extends StatefulWidget {
  @override
  _MovieListScreenState createState() => _MovieListScreenState();
}

class _MovieListScreenState extends State<MovieListScreen> {
  final MovieDB _movieDB = MovieDB(apiKey: 'YOUR_API_KEY'); // 替换为你的TMDb API密钥
  List<Movie> _movies = [];

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

  Future<void> _fetchMovies() async {
    try {
      final response = await _movieDB.fetchMovies(page: 1);
      setState(() {
        _movies = response.results;
      });
    } catch (e) {
      print('Error fetching movies: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Movie List'),
      ),
      body: _movies.isEmpty
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemCount: _movies.length,
              itemBuilder: (context, index) {
                final movie = _movies[index];
                return ListTile(
                  title: Text(movie.title),
                  subtitle: Text(movie.overview),
                  leading: Image.network(
                    movie.posterPath ?? '',
                    width: 100,
                    height: 150,
                    fit: BoxFit.cover,
                  ),
                );
              },
            ),
    );
  }
}

// 假设MovieDB和Movie类是由flutter_movie_db插件提供的
// 实际上,你需要根据插件的实际API来调整这些类
class MovieDB {
  final String apiKey;

  MovieDB({required this.apiKey});

  Future<MovieResponse> fetchMovies({required int page}) async {
    // 这里应该是实际的网络请求代码,使用Dart的http客户端或插件的API
    // 例如:
    // final response = await http.get('https://api.themoviedb.org/3/movie/popular?api_key=$apiKey&page=$page');
    // return MovieResponse.fromJson(response.body);
    // 由于这是一个示例,我们直接返回一个模拟的响应
    return MovieResponse(
      page: page,
      totalResults: 20,
      totalPages: 10,
      results: List.generate(20, (index) => Movie(
        id: index + 1,
        title: 'Movie Title $index',
        overview: 'This is a movie overview.',
        posterPath: '/path/to/poster$index.jpg',
      )),
    );
  }
}

class MovieResponse {
  int page;
  int totalResults;
  int totalPages;
  List<Movie> results;

  MovieResponse({
    required this.page,
    required this.totalResults,
    required this.totalPages,
    required this.results,
  });

  // 从JSON反序列化的工厂方法(实际使用时需要根据API响应格式实现)
  factory MovieResponse.fromJson(String str) => MovieResponse.fromMap(jsonDecode(str));

  factory MovieResponse.fromMap(Map<String, dynamic> json) => MovieResponse(
    page: json['page'],
    totalResults: json['total_results'],
    totalPages: json['total_pages'],
    results: List<Movie>.from(json['results'].map((x) => Movie.fromMap(x))),
  );
}

class Movie {
  int id;
  String title;
  String overview;
  String? posterPath;

  Movie({
    required this.id,
    required this.title,
    required this.overview,
    this.posterPath,
  });

  // 从JSON反序列化的工厂方法(实际使用时需要根据API响应格式实现)
  factory Movie.fromJson(String str) => Movie.fromMap(jsonDecode(str));

  factory Movie.fromMap(Map<String, dynamic> json) => Movie(
    id: json['id'],
    title: json['title'],
    overview: json['overview'],
    posterPath: json['poster_path'],
  );
}

注意

  1. 上面的代码是一个简化的示例,实际使用时你需要根据flutter_movie_db插件(或类似的插件)的API文档来调整代码。
  2. 确保你已经从TMDb获取了一个API密钥,并在代码中替换YOUR_API_KEY
  3. 实际的网络请求部分需要根据插件提供的API来实现。

希望这个示例能帮助你开始使用Flutter进行电影数据库查询。如果你使用的插件名称或API有所不同,请参考该插件的官方文档进行调整。

回到顶部