如何在 flutter 中使用 injectable 和 get_it 的共享偏好?
How Use shared preference with injectable and get_it in flutter?
我在 flutter 中使用可注入和 get_it 包
我有一个共同的偏好 class :
@LazySingleton()
class SharedPref {
final String _token = 'token';
SharedPreferences _pref;
SharedPref(this._pref);
Future<String> getToken() async {
return _pref.getString(_token) ?? '';
}
Future<void> setToken(String token) async {
await _pref.setString(_token, token);
}
}
这个 class 注入为 LazySingleton 并且我有一个用于注入共享首选项的模块:
@module
abstract class InjectableModule {
@lazySingleton
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
in bloc class 我正在使用 SharedPref class :
@injectable
class LoginCheckBloc extends Bloc<LoginCheckEvent, LoginCheckState> {
final SharedPref sharedPref;
LoginCheckBloc({@required this.sharedPref}) : super(const LoginCheckState.initial());
@override
Stream<LoginCheckState> mapEventToState(
LoginCheckEvent event,
) async* {
if (event is CheckLogin) {
final String token = await sharedPref.getToken();
if (token.isEmpty){
yield const LoginCheckState.notLogin();
}else{
yield const LoginCheckState.successLogin();
}
}
}
}
当我将 LoginCheckBloc 与 getIt<> 一起使用时,我在注入共享首选项时遇到错误:
BlocProvider<LoginCheckBloc>(
create: (BuildContext context) => getIt<LoginCheckBloc>()..add(CheckLogin()),
),
错误信息是:
You tried to access an instance of SharedPreferences that was not ready yet
'package:get_it/get_it_impl.dart':
Failed assertion: line 272 pos 14: 'instanceFactory.isReady'
如何使用可注射的共享偏好??
我可以通过用 GetIt.I.isReady<SharedPreferences>()
包装 runApp()
来解决它。
void main() {
WidgetsFlutterBinding.ensureInitialized();
GetIt.I.isReady<SharedPreferences>().then((_) {
runApp(MyApp());
});
}
当我使用 @preResolve
和 SharedPreference
时它对我有效
@module
abstract class InjectableModule{
@preResolve
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
然后在注射器上 class 你写这个
final GetIt getIt = GetIt.instance;
@injectableInit
Future<void> configureInjection(String env) async {
await $initGetIt(getIt, environment: env);
}
主要 class
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await configureInjection(Environment.prod);
runApp(MyApp());
}
我在 flutter 中使用可注入和 get_it 包 我有一个共同的偏好 class :
@LazySingleton()
class SharedPref {
final String _token = 'token';
SharedPreferences _pref;
SharedPref(this._pref);
Future<String> getToken() async {
return _pref.getString(_token) ?? '';
}
Future<void> setToken(String token) async {
await _pref.setString(_token, token);
}
}
这个 class 注入为 LazySingleton 并且我有一个用于注入共享首选项的模块:
@module
abstract class InjectableModule {
@lazySingleton
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
in bloc class 我正在使用 SharedPref class :
@injectable
class LoginCheckBloc extends Bloc<LoginCheckEvent, LoginCheckState> {
final SharedPref sharedPref;
LoginCheckBloc({@required this.sharedPref}) : super(const LoginCheckState.initial());
@override
Stream<LoginCheckState> mapEventToState(
LoginCheckEvent event,
) async* {
if (event is CheckLogin) {
final String token = await sharedPref.getToken();
if (token.isEmpty){
yield const LoginCheckState.notLogin();
}else{
yield const LoginCheckState.successLogin();
}
}
}
}
当我将 LoginCheckBloc 与 getIt<> 一起使用时,我在注入共享首选项时遇到错误:
BlocProvider<LoginCheckBloc>(
create: (BuildContext context) => getIt<LoginCheckBloc>()..add(CheckLogin()),
),
错误信息是:
You tried to access an instance of SharedPreferences that was not ready yet
'package:get_it/get_it_impl.dart':
Failed assertion: line 272 pos 14: 'instanceFactory.isReady'
如何使用可注射的共享偏好??
我可以通过用 GetIt.I.isReady<SharedPreferences>()
包装 runApp()
来解决它。
void main() {
WidgetsFlutterBinding.ensureInitialized();
GetIt.I.isReady<SharedPreferences>().then((_) {
runApp(MyApp());
});
}
当我使用 @preResolve
和 SharedPreference
@module
abstract class InjectableModule{
@preResolve
Future<SharedPreferences> get prefs => SharedPreferences.getInstance();
}
然后在注射器上 class 你写这个
final GetIt getIt = GetIt.instance;
@injectableInit
Future<void> configureInjection(String env) async {
await $initGetIt(getIt, environment: env);
}
主要 class
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await configureInjection(Environment.prod);
runApp(MyApp());
}