您可以将令牌存储在Repository,例如userRepository.persistToken(event.token) 和await userRepository.deleteToken();
存储库的行为类似于存储库模式。您无需知道数据来自云端或本地数据库
在下面的示例中,userRepository 可以是应用级别,因此所有 bloc 都可以使用它
完整示例代码https://github.com/felangel/bloc/blob/master/examples/flutter_login/lib/authentication/authentication_bloc.dart
代码 sn -p
void main() {
BlocSupervisor.delegate = SimpleBlocDelegate();
final userRepository = UserRepository();
runApp(
BlocProvider<AuthenticationBloc>(
create: (context) {
return AuthenticationBloc(userRepository: userRepository)
..add(AppStarted());
},
child: App(userRepository: userRepository),
),
);
}
...
import 'package:meta/meta.dart';
import 'package:bloc/bloc.dart';
import 'package:user_repository/user_repository.dart';
import 'package:flutter_login/authentication/authentication.dart';
class AuthenticationBloc
extends Bloc<AuthenticationEvent, AuthenticationState> {
final UserRepository userRepository;
AuthenticationBloc({@required this.userRepository})
: assert(userRepository != null);
@override
AuthenticationState get initialState => AuthenticationUninitialized();
@override
Stream<AuthenticationState> mapEventToState(
AuthenticationEvent event,
) async* {
if (event is AppStarted) {
final bool hasToken = await userRepository.hasToken();
if (hasToken) {
yield AuthenticationAuthenticated();
} else {
yield AuthenticationUnauthenticated();
}
}
if (event is LoggedIn) {
yield AuthenticationLoading();
await userRepository.persistToken(event.token);
yield AuthenticationAuthenticated();
}
if (event is LoggedOut) {
yield AuthenticationLoading();
await userRepository.deleteToken();
yield AuthenticationUnauthenticated();
}
}
}
您可以使用MultiBlocProvider 在应用程序级别包装您的块
下面的例子是地图和位置
https://gitlab.kaleidos.net/piweek/betover/betover-mobile/blob/7b9368288743be602f37014f7a49ed4ef943afc1/lib/main.dart
void main() {
BlocSupervisor.delegate = SimpleBlocDelegate();
runApp(
MultiBlocProvider(
providers: [
BlocProvider<MapBloc>(
create: (context) => MapBloc(),
),
BlocProvider<PoisBloc>(
create: (context) => PoisBloc(
mapBloc: BlocProvider.of<MapBloc>(context),
),
),
],
child: App(),
)
);
}
class App extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Bet Over',
theme: appTheme,
initialRoute: '/',
routes: {
'/': (context) =>
MultiBlocProvider(
providers: [
BlocProvider<MapBloc>(
create: (context) => BlocProvider.of<MapBloc>(context),
),
BlocProvider<PoisBloc>(
create: (context) => BlocProvider.of<PoisBloc>(context),
),
],
child: MapPage(),
),
'/create-poi': (context) =>
MultiBlocProvider(
providers: [
BlocProvider<MapBloc>(
create: (context) => BlocProvider.of<MapBloc>(context),
),
BlocProvider<PoisBloc>(
create: (context) => BlocProvider.of<PoisBloc>(context),
),
],
child: CreatePoimPage(),
),
}
);
}
}
并使用它https://gitlab.kaleidos.net/piweek/betover/betover-mobile/blob/7b9368288743be602f37014f7a49ed4ef943afc1/lib/ui/widgets/map.dart
class _MapState extends State<Map> {
MapBloc _mapBloc;
PoisBloc _poisBloc;
@override
void initState() {
super.initState();
_mapBloc = BlocProvider.of<MapBloc>(context);
_poisBloc = BlocProvider.of<PoisBloc>(context);
...
List<Marker> _generateMarkers () {
if (!(_mapBloc.state is MapViewboxChanged && _poisBloc.state is PoisLoaded))
return [];