GithubHelp home page GithubHelp logo

bizz84 / movie_app_state_management_flutter Goto Github PK

View Code? Open in Web Editor NEW
547.0 13.0 98.0 1.17 MB

Flutter State Management: Movie App with Provider, Riverpod, flutter_bloc

Home Page: https://codewithandrea.com

License: MIT License

Kotlin 0.29% Dart 85.79% Ruby 3.39% Swift 1.21% Objective-C 0.08% HTML 4.22% CMake 3.03% C++ 1.70% C 0.29%
flutter state-management riverpod flutter-bloc provider sembast rxdart

movie_app_state_management_flutter's Introduction

Flutter State Management: Movie App with Provider, Riverpod, flutter_bloc & more

This reference project shows how to implement a (Netflix-inspired) movie app with different state management techniques in Flutter:

Movie app preview

The project uses the TMDB API to fetch a list of movies, and includes features such as pagination and local storage.

Running the project

Before running, see instructions on how to get a TMDB API key.

Also, make sure to run on Flutter beta channel.

App Overview

The application is composed by three primary screens: Now Playing, Favourites and Profiles.

On first launch, the app asks the user to create a profile.

The Now Playing page loads a list of current movies from the TMDB API. Results are paginated and scrolling to the bottom causes the next page to be loaded.

Each movie shows as a poster using the image URL retrieved from the API. You can tap on the ❤️ icon to add a movie as a favourite (for the selected profile), and this preference is persisted to local disk.

Open the Favourites page to see the list of favourites for the currently selected profile.

Use the Profiles page to create additional profiles and update the currently selected profile (this is inspired by the Netflix UI).

Features

  • "Now Playing" movies (with pagination)
  • Save favourites to watch list
  • Multiple profiles (like Netflix)
  • Local data persistence (movies, favourites, profiles) with Sembast

Combining these features together makes for an interesting case study about state management in Flutter.

App Structure

This app was made to compare and contrast multiple state management approaches. A highly composable architecture has been designed to enable this.

The project folders are structured like this:

/apps
  /flutter_bloc
  /riverpod
  /provider
  ... and more
/packages
  /core
    /lib
      /api
      /models
        /app_models
        /app_state
        /tmdb
      /persistence
      /ui

Each folder inside apps is a Flutter project that implements the same app with a specific state management package.

All common functionality lives in packages/core. This includes a TMDB API wrapper, along with model classes with supporting serialization code where needed.

The persistence folder contains a DataStore abstract class that is used by all apps, along with a concrete SembastDataStore class to read and write data to local storage (using Sembast as a NoSQL database).

The ui folder contains all the custom widgets that are shared by all apps. These widgets do not hold any business logic and are designed to show the app UI and expose callbacks for the application code to plug into (much like the built-in Flutter widgets).

All the logic lives inside the apps themselves. All apps have exactly the same folders:

lib
  /app
    /app_startup
    /create_profile
    /favourites
    /now_playing
    /profile_selection

The business logic and screen flows are identical for each app, but the semantics change depending on which state management package is used. This makes it easy to compare and constrast different solutions.

Supported state management solutions

The current state management solutions are currently supported:

I plan to add more in the future (PRs welcome!).

Future Roadmap

  • Add more screens
  • Polish the UI

Feel free to open issues if you'd like certain features to be implemented (though keep your expectations low, I'm doing this for free after all 😉).

Other packages in use

The "core" package of the app uses the following packages:

Getting a TMDB API key

This project uses the TMDB API to get the latest movies data.

Before running the app you need to sign up on the TMDB website, then obtain an API key on the settings API page.

Once you have this, create an .env file inside packages/core/, and add your key:

// .env
TMDB_KEY=your-api-key

Then, run the code generator:

flutter pub run build_runner build --delete-conflicting-outputs

This will generate a env.g.dart file inside packages/core/lib/api, that is used when making requests to the TMDB API.

Congratulations, you're good to go. 😎

Note: Loading images from insecure HTTP endpoints

The data returned by the TMBD API points to image URLs using http rather than https. In order for images to load correctly, the following changes have been made:

Android

Created a file at android/app/src/main/res/xml/network_security_config.xml with these contents:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

Added this to the application tag in the AndroidManifest.xml:

android:networkSecurityConfig="@xml/network_security_config"

iOS

Add the following to ios/Runner/info.pList:

  <key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>

More information here:

macOS

Since macOS applications are sandboxed by default, we get a SocketException if we haven't added the required entitlements. This has been fixes by adding these lines to macos/Runner/DebugProfile.entitlements and macos/Runner/Release.entitlements:

<key>com.apple.security.network.client</key>
<true/>

More info here:

Credits

This project was inspired by flutter_architecture_samples by the Flutter community.

movie_app_state_management_flutter's People

Contributors

bizz84 avatar gifatahth avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

movie_app_state_management_flutter's Issues

A bunch of errors

For example sembast_data_store.dart line 157
`The value

The return type 'dynamic' isn't a 'bool', as required by the closure's context.dart(return_of_invalid_type_from_closure)`

flutter doctor -v

[√] Flutter (Channel stable, 2.0.2, on Microsoft Windows [Version 10.0.18363.1440], locale en-US)
• Flutter version 2.0.2 at C:\src\flutter
• Framework revision 8962f6dc68 (6 days ago), 2021-03-11 13:22:20 -0800
• Engine revision 5d8bf811b3
• Dart version 2.12.1

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.0-rc2)
• Android SDK at C:\Users\Teq\AppData\Local\Android\sdk
• Platform android-30, build-tools 30.0.0-rc2
• Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)
• All Android licenses accepted.

[√] Chrome - develop for the web
• Chrome at C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

[√] Android Studio (version 4.1.0)
• Android Studio at C:\Program Files\Android\Android Studio
• Flutter plugin can be installed from:
https://plugins.jetbrains.com/plugin/9212-flutter
• Dart plugin can be installed from:
https://plugins.jetbrains.com/plugin/6351-dart
• Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] IntelliJ IDEA Ultimate Edition (version 2020.1)
• IntelliJ at C:\Program Files\JetBrains\IntelliJ IDEA 2020.1
• Flutter plugin version 45.1.3
• Dart plugin version 201.7223.43

[√] VS Code, 64-bit edition (version 1.54.3)
• VS Code at C:\Program Files\Microsoft VS Code
• Flutter extension version 3.20.0

[√] Connected device (4 available)
• Pixel 3a (mobile) • 93GAY0B28F • android-arm64 • Android 11 (API 30)
• Android SDK built for x86 (mobile) • emulator-5554 • android-x86 • Android 10 (API 29) (emulator)
• Chrome (web) • chrome • web-javascript • Google Chrome 89.0.4389.82
• Edge (web) • edge • web-javascript • Microsoft Edge 89.0.774.50

`Pub Get` is failed

I try to run one of your sample (riverpod) but the Pub Get is failed

Running "flutter pub get" in riverpod...                        
Because movie_app_demo_flutter depends on integration_test any from sdk which doesn't exist (could not find package integration_test in the Flutter SDK), version solving failed.

pub get failed (server unavailable) -- attempting retry 1 in 1 second...

Seeing an answer in Stackoverflow, I try to comment out integration_test

dev_dependencies:
#  integration_test:
#    sdk: flutter

But then, get new issue

Running "flutter pub get" in riverpod...                        


The current Dart SDK version is 2.10.4.

Because movie_app_demo_flutter depends on cupertino_icons >=1.0.1 which requires SDK version >=2.12.0-0 <3.0.0, version solving failed.
pub get failed (1; Because movie_app_demo_flutter depends on cupertino_icons >=1.0.1 which requires SDK version >=2.12.0-0 <3.0.0, version solving failed.)
Process finished with exit code 1

My Flutter Doctor is:

[✓] Flutter (Channel stable, 1.22.5, on macOS 11.2 20D64 darwin-x64, locale en-VN)
    • Flutter version 1.22.5 at /Users/trietbui/Library/flutter
    • Framework revision 7891006299 (8 weeks ago), 2020-12-10 11:54:40 -0800
    • Engine revision ae90085a84
    • Dart version 2.10.4

Can you share with me your Flutter Doctor too?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.