I want to pass Token to headers ("Authorization": "Bearer " +getToken). Otherwise i cannot make a mutation because the user is identified with the token in the headers. Do you have to do anything in the mutation function? E.g. in the mutation function add headers? I use the graphql_flutter package.
Backend: NodeJs - Apollo.
here my code:
main:
import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import './pages/auth_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'pages/auth_add_address_screen.dart';
import './client.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Config.functionGetToken();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
Future<String> getTheToken() async {
SharedPreferences _prefs = await SharedPreferences.getInstance();
String token = _prefs.getString("token");
return token;
}
@override
Widget build(BuildContext context) {
return GraphQLProvider(
client: Config.initailizeClient(),
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
unselectedWidgetColor: Colors.white60,
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: AuthScreen(),
routes: {
AuthAddAddress.routeName: (ctx) => AuthAddAddress(),
AuthScreen.routeName: (ctx) => AuthScreen(),
},
),
);
}
}
client:
import 'package:flutter/material.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Config {
static SharedPreferences pref;
static final HttpLink httpLink = HttpLink(
uri: 'http://10.0.2.2:4000/graphql',
headers: {"Authorization": "Bearer " + pref.getString("token")});
static final AuthLink authLink =
AuthLink(getToken: () => pref.getString("token"));
static final Link link = authLink.concat(httpLink);
static String token;
static functionGetToken() async {
pref = await SharedPreferences.getInstance();
}
static ValueNotifier<GraphQLClient> initailizeClient() {
ValueNotifier<GraphQLClient> client = ValueNotifier(
GraphQLClient(
cache: OptimisticCache(dataIdFromObject: typenameDataIdFromObject),
link: link,
),
);
return client;
}
}
Here my onPressed() method where i get the token and set it:
onPressed: () async {
if (_authMode == AuthMode.Signup) {
if (_userRegGlobalKey.currentState.validate()) {
var userMutation = runMutation(
{
'email': _emailController.text,
'password': _passwordController.text,
'firstname': _firstnameController.text,
'lastname': _lastnameController.text,
},
);
var result = await userMutation.networkResult;
if (result.hasException) {
return Text(result.exception.toString());
}
if (result.loading) {
return Center(
child: Platform.isAndroid
? CircularProgressIndicator()
: CupertinoActivityIndicator(),
);
} else {
String _token = await result
.data["createUser"]["token"];
String _refreshToken = await result
.data["createUser"]["refreshToken"];
if (_token != null && _refreshToken != null) {
SharedPreferences pref =
await SharedPreferences.getInstance();
pref.setString("token", _token);
pref.setString("refreshToken", _refreshToken);
print(_token);
print(_refreshToken);
Navigator.of(context)
.pushNamed(AuthAddAddress.routeName);
}
}
}
}
},