fuery 0.0.1

SDKflutter
Platformandroidioswindowslinuxmacosweb

Asynchronous state management library that helps implements the server side state management in Flutter

Fuery Core

Asynchronous state management library that helps implements the server side state management in Flutter

Features

  • Async data fetching, caching, invalidation, pagination
  • Mutation with side effect
  • Widget builders and listeners

Installation

flutter pub add fuery

Basic Usage

Query

int id = 2;

// QueryResult<Post, Error>
late final post = Query.use<Post, Error>(
  queryKey: ['posts', id],
  queryFn: () => repository.getPostById(id),
);


// Widget
...
return QueryBuilder(
    query: post,
    builder: (context, state) {
        if (state.status.isPending) {
            ...
        }

        if (state.status.isError) {
            ...
        }
    }
);

Infinite Query

class PageResponse<T> {
  final List<T> items;
  final int? nextCursor;

  ...
  
  factory PageResponse.fromJson(Map<String, dynamic> map) {
    return ...;
  }
}

class MyRepository {
  Future<PageResponse<Post>> getPostsByPage(int page) async {
    try {
      return PageResponse.fromJson(...);
    } catch(_) {
      throw Error();
    }
  }
}

// InfiniteQueryResult<int, List<InfiniteData<int, PageResponse<Post>>>, Error>
late final posts = InfiniteQuery.use<int, PageResponse<Post>, Error>(
  queryKey: ['posts', 'list'],
  queryFn: (int page) => repository.getPostsByPage(page),
  initialPageParam: 1,
  getNextPageParam: (lastPage, allPages) {
    print(lastPage.runtimeType) // InfiniteData<int, PageResponse<Post>>,
    print(allPages.runtimeType) // List<InfiniteData<int, PageResponse<Post>>>,
    
    return lastPage.data.nextPage;
  },
);

// Widget
...
return InfiniteQueryBuilder(
    query: posts,
    builder: (context, state) {
        if (state.status.isPending) {
            ...
        }

        if (state.status.isError) {
            ...
        }
    }
);

Mutation

// MutationResult<Post, Error, void Function(String), Future<Post> Function(String)>
late final createPost = Mutation.use<String, Post, Error>(
  mutationFn: (String content) => repository.createPost(content),
  onMutate: (param) => print('mutate started'),
  onSuccess: (param, data) => print('mutate succeed'),
  onError: (param, error) => print('mutate error occurred'),
);

createPost.mutate('some content');
// or
await createPost.mutateAsync('some content');

Mutation without parameters

Sometimes you may need a Mutation without parameters. In such situations, you can use the Mutation.noParams constructor.

// MutationResult<Post, Error, void Function(), Future<void> Function()>
late final createRandomPost = Mutation.noParams<Post, Error>(
  mutationFn: () => repository.createRandomPost(),
  onMutate: () => print('mutate started'),
  onSuccess: (data) => print('mutate succeed'),
  onError: (error) => print('mutate error occurred'),
);

createRandomPost.mutate();
// or
await createRandomPost.mutateAsync();

MutationBuilder


// Shows loading barrier when deleting todo item.
MutationBuilder(
  mutation: deleteTodo,
  builder: (context, state) {
    if (state.status.isPending) {
      return LoadingBarrier();
    }

    return const SizedBox();
  },
),

Fuery Client

// invalidate.
Fuery.invalidateQueries(queryKey: ['posts']);

// Default query options configuration
Fuery.configQueryOptions(
  query: QueryOptions(...),
  infiniteQuery: InfiniteQueryOptions(...),
);

Todo

  • More complex features like query-core (from react-query)