1
- import 'dart:async' ;
2
- import 'dart:convert' ;
3
- import 'dart:io' ;
4
-
5
- import 'package:chopper/chopper.dart' ;
6
1
import 'package:flutter/material.dart' ;
7
2
import 'package:mobile_app/generated_api/client_index.dart' ;
8
3
@@ -36,13 +31,9 @@ class MyHomePage extends StatefulWidget {
36
31
}
37
32
38
33
class _MyHomePageState extends State <MyHomePage > {
39
- int _counter = 0 ;
40
34
String _text = "" ;
41
35
42
36
void _incrementCounter () {
43
- setState (() {
44
- _counter++ ;
45
- });
46
37
_test ();
47
38
}
48
39
@@ -56,11 +47,10 @@ class _MyHomePageState extends State<MyHomePage> {
56
47
57
48
final Openapi api = Openapi .create (
58
49
baseUrl: Uri .parse ("http://localhost:5800" ),
59
- errorConverter: const JsonConverter (),
60
50
);
61
51
62
52
try {
63
- final data1 = await api.helloGet (name: "Olly " );
53
+ final data1 = await api.helloGet (name: "Json " );
64
54
setState (() {
65
55
_text = data1.body! ; // << Is string, or can be complex object.
66
56
});
@@ -80,14 +70,7 @@ class _MyHomePageState extends State<MyHomePage> {
80
70
child: Column (
81
71
mainAxisAlignment: MainAxisAlignment .center,
82
72
children: < Widget > [
83
- const Text (
84
- 'You have pushed the button this many times:' ,
85
- ),
86
73
Text (_text),
87
- Text (
88
- '$_counter ' ,
89
- style: Theme .of (context).textTheme.headlineMedium,
90
- ),
91
74
],
92
75
),
93
76
),
@@ -99,137 +82,3 @@ class _MyHomePageState extends State<MyHomePage> {
99
82
);
100
83
}
101
84
}
102
-
103
- class MyAuthenticator extends Authenticator {
104
- String token = "" ;
105
-
106
- @override
107
- FutureOr <Request ?> authenticate (
108
- Request request,
109
- Response response, [
110
- Request ? originalRequest,
111
- ]) async {
112
- if (response.statusCode == HttpStatus .unauthorized) {
113
- String ? newToken = await refreshToken ();
114
-
115
- final Map <String , String > updatedHeaders = Map <String , String >.of (request.headers);
116
-
117
- if (newToken != null ) {
118
- newToken = 'Bearer $newToken ' ;
119
- updatedHeaders.update ('Authorization' , (String _) => newToken! , ifAbsent: () => newToken! );
120
- return request.copyWith (headers: updatedHeaders);
121
- }
122
- }
123
- return null ;
124
- }
125
-
126
- Future <String ?> refreshToken () async {
127
- return token;
128
- }
129
- }
130
-
131
- @immutable
132
- class JsonConverter implements Converter , ErrorConverter {
133
- const JsonConverter ();
134
-
135
- @override
136
- Request convertRequest (Request request) => encodeJson (
137
- applyHeader (
138
- request,
139
- contentTypeKey,
140
- jsonHeaders,
141
- override: false ,
142
- ),
143
- );
144
-
145
- Request encodeJson (Request request) {
146
- final String ? contentType = request.headers[contentTypeKey];
147
-
148
- if ((contentType? .contains (jsonHeaders) ?? false ) && (request.body.runtimeType != String || ! isJson (request.body))) {
149
- return request.copyWith (body: json.encode (request.body));
150
- }
151
-
152
- return request;
153
- }
154
-
155
- FutureOr <Response > decodeJson <BodyType , InnerType >(Response response) async {
156
- final List <String > supportedContentTypes = [jsonHeaders, jsonApiHeaders];
157
-
158
- if (response.statusCode != 200 ) {
159
- // Convert body to json
160
- JsonDecoder decoder = const JsonDecoder ();
161
- var body = decoder.convert (response.body);
162
- throw ApiError (status: body['status' ], message: body['message' ]);
163
- }
164
-
165
- final String ? contentType = response.headers[contentTypeKey];
166
- var body = response.body;
167
-
168
- if (supportedContentTypes.contains (contentType)) {
169
- body = utf8.decode (response.bodyBytes);
170
- }
171
-
172
- body = await tryDecodeJson (body);
173
- if (isTypeOf <BodyType , Iterable <InnerType >>()) {
174
- body = body.cast <InnerType >();
175
- } else if (isTypeOf <BodyType , Map <String , InnerType >>()) {
176
- body = body.cast <String , InnerType >();
177
- }
178
-
179
- return response.copyWith <BodyType >(body: body);
180
- }
181
-
182
- @override
183
- FutureOr <Response <BodyType >> convertResponse <BodyType , InnerType >(
184
- Response response,
185
- ) async =>
186
- (await decodeJson <BodyType , InnerType >(response)) as Response <BodyType >;
187
-
188
- @protected
189
- FutureOr <dynamic > tryDecodeJson (String data) {
190
- try {
191
- return json.decode (data);
192
- } catch (e) {
193
- chopperLogger.warning (e);
194
-
195
- return data;
196
- }
197
- }
198
-
199
- @override
200
- FutureOr <Response > convertError <BodyType , InnerType >(
201
- Response response,
202
- ) async =>
203
- await decodeJson (response);
204
-
205
- static FutureOr <Response <BodyType >> responseFactory <BodyType , InnerType >(
206
- Response response,
207
- ) =>
208
- const JsonConverter ().convertResponse <BodyType , InnerType >(response);
209
-
210
- static Request requestFactory (Request request) => const JsonConverter ().convertRequest (request);
211
-
212
- @visibleForTesting
213
- static bool isJson (dynamic data) {
214
- try {
215
- json.decode (data);
216
- return true ;
217
- } catch (_) {
218
- return false ;
219
- }
220
- }
221
- }
222
-
223
- class ApiError {
224
- final String status;
225
- final String message;
226
-
227
- ApiError ({required this .status, required this .message});
228
-
229
- factory ApiError .fromJson (Map <String , dynamic > json) {
230
- return ApiError (
231
- status: json['status' ],
232
- message: json['message' ],
233
- );
234
- }
235
- }
0 commit comments