Skip to content

Instantly share code, notes, and snippets.

View anubhav11803451's full-sized avatar
1003+

Anubhav Gupta anubhav11803451

1003+
View GitHub Profile
@anubhav11803451
anubhav11803451 / API_flow_saga.md
Created September 16, 2022 14:08 — forked from nomrik/API_flow_saga.md
API requests flow with Redux Saga

API requests flow

Introduction

In Redux, API requests are considered side effects, outside the regular Redux flow. Thus, they are normally handled by a middleware. Out of the many libraries available, one of the most popular is Redux Saga. Redux Saga has two main advantages over the other options:

  • It is built around JavaScript's generator functions, which make it possible to write async logic in a way that is easy to reason about.
  • It is easy to test.
  • When using it, all of the Redux actions are always just plain objects, unlike other middleware libraries which require async actions to be functions. That way it is possible to keep the standard Redux Flow, dispatching just regular actions. If the action is supposed to trigger async logic, the middleware will handle it.

This document is meant to descr

https://prod.liveshare.vsengsaas.visualstudio.com/join?F2DF06A28E6C870F0F1ABFA37008117BF947
Widget build(BuildContext context) {
return StoreConnector<AppState, AuthViewModel>(
onInit: (store) {
store.dispatch(getAuthStateThunk());
SecureStorage.readSecureStorage('token').then((value) => token = value);
},
converter: (store) => AuthViewModel.fromStore(store),
builder: (context, viewModel) =>
token != null ? MyWorkspacesPage() : GettingStartedScreen(),
);
class SecureStorage {
static FlutterSecureStorage secureStorage = FlutterSecureStorage();
static Future writeSecureStorage(String key, String value) async {
var writtenData = await secureStorage.write(key: key, value: value);
return writtenData;
}
static Future readSecureStorage(String key) async {
String readData = await secureStorage.read(key: key);
import 'package:redux/redux.dart';
import 'package:redux_in_flutter/models/photosModel.dart';
import 'package:redux_in_flutter/redux/states/appState.dart';
class PhotosViewModel {
final bool isFetching;
final bool fetchingError;
final List<Photos> photos;
PhotosViewModel({this.isFetching, this.fetchingError, this.photos});
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:redux_in_flutter/redux/states/appState.dart';
import 'package:redux_in_flutter/redux/thunks/photosThunk.dart';
import 'package:redux_in_flutter/redux/viewmodels/photosViewModel.dart';
import 'package:transparent_image/transparent_image.dart';
class HomeScreen extends StatelessWidget {
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:redux_in_flutter/redux/store.dart';
import 'package:redux_in_flutter/screens/homeScreen.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
final store = Redux.store;
@override
import 'package:redux/redux.dart';
import 'package:redux_in_flutter/redux/reducers/appReducers.dart';
import 'package:redux_in_flutter/redux/states/appState.dart';
import 'package:redux_thunk/redux_thunk.dart';
class Redux {
static final Store<AppState> _store = Store<AppState>(
appReducer,
initialState: new AppState.initial(),
middleware: [thunkMiddleware],
import 'package:flutter/material.dart';
import 'package:redux_in_flutter/redux/states/photosState.dart';
@immutable
class AppState {
final PhotoState photoState;
AppState({
@required this.photoState,
});
import 'package:redux_in_flutter/redux/reducers/photosReducer.dart';
import 'package:redux_in_flutter/redux/states/appState.dart';
AppState appReducer(AppState state, action) {
return AppState(photoState: photosReducer(state.photoState, action));
}