Skip to content

Instantly share code, notes, and snippets.

@micklaw
Last active October 5, 2022 20:04
Show Gist options
  • Save micklaw/a793ee3a0bf714a383aeeedca8d1a36c to your computer and use it in GitHub Desktop.
Save micklaw/a793ee3a0bf714a383aeeedca8d1a36c to your computer and use it in GitHub Desktop.
Flutter IsolateClient Paging
import 'dart:isolate';
import 'package:uuid/uuid.dart';
import 'package:ferry/ferry.dart';
import 'package:ferry_flutter/ferry_flutter.dart';
import 'package:ferry/ferry_isolate.dart';
import 'package:ferry_test/graphql/queries/__generated__/reviews.data.gql.dart';
import 'package:ferry_test/graphql/queries/__generated__/reviews.req.gql.dart';
import 'package:ferry_test/graphql/queries/__generated__/reviews.var.gql.dart';
import 'package:ferry_test/links.dart';
import 'package:flutter/material.dart';
GReviewsData? _mergeReviews(GReviewsData? previous, GReviewsData? result) {
final merged =
previous?.rebuild((b) => b..reviews.addAll(result?.reviews ?? [])) ??
result;
return merged;
}
Future<Client> _initClient(Null params, SendPort? sendPort) async {
return Client(link: ReviewsAutoResponderTerminalLink());
}
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _offset = 0;
late GReviewsReq _request;
IsolateClient? _client = null;
late Uuid uuid;
_MyHomePageState() {
uuid = const Uuid();
_request = GReviewsReq((b) => b
..requestId = uuid.v4()
..vars.first = 0
..vars.offset = _offset);
}
Future<bool> _init() async {
_client = await IsolateClient.create(_initClient, params: null);
return true;
}
Future _reset() async {
_offset = 0;
_request = _request.rebuild((b) => b
..fetchPolicy = FetchPolicy.CacheAndNetwork
//..requestId = uuid.v4()
..vars.first = 0
..vars.offset = _offset);
await _client!.addRequestToRequestController(_request);
}
Future _page() async {
_offset++;
final req = _request.rebuild((b) => b
..fetchPolicy = FetchPolicy.CacheAndNetwork
..updateResult = _mergeReviews
..vars.first = 1
..vars.offset = _offset);
await _client!.addRequestToRequestController(req);
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _init(),
builder: (context, snapshot) {
if (!snapshot.hasData) return const CircularProgressIndicator();
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Operation<GReviewsData, GReviewsVars>(
client: _client!,
operationRequest: _request,
builder: (context, response, error) {
if (response?.loading == true) {
return const CircularProgressIndicator();
}
return Text(
'${response?.data?.reviews?.length ?? 0}',
style: Theme.of(context).textTheme.headline4,
);
},
),
TextButton(
style: ButtonStyle(
foregroundColor:
MaterialStateProperty.all<Color>(Colors.blue),
),
onPressed: () async => await _reset(),
child: const Text('Reset'),
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async => await _page(),
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
});
}
}
name: ferry_test
description: A new Flutter project.
publish_to: 'none'
version: 1.0.0+1
environment:
sdk: ">=2.17.6 <3.0.0"
dependencies:
flutter:
sdk: flutter
ferry: 0.11.2-dev.5
ferry_flutter: 0.6.2-dev.4
gql_code_builder: ^0.6.0
uuid:
cupertino_icons: ^1.0.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^2.0.0
flutter:
uses-material-design: true
@micklaw
Copy link
Author

micklaw commented Oct 5, 2022

On line. 76 of main.dart, if I uncomment this line, then my refresh doesnt work. I feel I may be misunderstanding the role of the request ID.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment