我试着用 Hive
内部Flutter Mobx
,在签入用户数据后 Hive
我切换到另一个屏幕,如 HomeView
或者
Intro main.dart
:
Future<void> main() async {
...
final appDocumentDirectory = await path_provider.getApplicationDocumentsDirectory();
Hive.init(appDocumentDirectory.path);
Hive.registerAdapter(UserAdapter());
_setUpLogging();
runApp(MultiProvider(providers: providers, child: StartupApplication()));
}
``` `StartupApplication` 班级:我不使用 `Hive` ```
class StartupApplication extends StatelessWidget {
@override
Widget build(BuildContext context) {
final isPlatformDark = WidgetsBinding.instance.window.platformBrightness == Brightness.dark;
final initTheme = isPlatformDark ? nebrassLightTheme : nebrassLightTheme;
return ThemeProvider(
initTheme: initTheme,
duration: const Duration(milliseconds: 400),
child: Builder(builder: (context) {
return MaterialApp(
title: 'TEST',
theme: ThemeProvider.of(context),
home: const OverlaySupport(child: OKToast(
child: MyHomePage() //--> checking user data widget
)),
onGenerateRoute: Routes.sailor.generator(),
navigatorKey: Routes.sailor.navigatorKey,
);
}),
);
}
}
检查 User
在 Hive
内部 MyHomePage
班级:
class MyHomePage extends StatefulWidget {
const MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return FutureBuilder<Box<User>>(
future: Hive.openBox('user'),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
final Box<User> userBox = snapshot.data;
if (userBox.values.isNotEmpty && userBox.get(0).active == 1) {
return HomeView();
} else {
return Intro();
}
} else {
return Container();
}
});
}
@override
void dispose() {
Hive.close();
super.dispose();
}
}
现在在其他屏幕中,例如 RegisterScreen
一级实施 MobX
我想在里面 user
框,例如:
class Register extends StatefulWidget {
@override
_RegisterState createState() => _RegisterState();
}
class _RegisterState extends State<Register> {
TextEditingController _mobileNumber;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
_mobileNumber = TextEditingController();
}
@override
Widget build(BuildContext context) {
final _registerViewModel = Provider.of<RegisterViewModel>(context, listen: false);
return Directionality(
textDirection: TextDirection.ltr,
child: Scaffold(
key: _scaffoldState,
...
//_registerViewModel.registerAccount(_mobileNumber.text, '111');
),
);
}
void _showSnackBar(String message, BuildContext context) {
_scaffoldState.currentState.showSnackBar(SnackBar(
content: Directionality(
textDirection: TextDirection.rtl,
child: Text(
'$message',
style: AppTheme.of(context).caption().copyWith(color: Colors.white),
))));
}
}
``` `MobX` 实施:
enum RegisterLoadingState { loading, done }
enum ActiveLoadingState { loading, done }
enum RegisteringState { initial, registered, activated, registerError, activeError }
class RegisterViewModel = _RegisterViewModel with _$RegisterViewModel;
abstract class _RegisterViewModel with Store {
final WebApi _webApi;
_RegisterViewModel({@required WebApi webApi}) : _webApi = webApi;
...
@action
Future registerAccount(String mobileNumber, String deviceId) async {
final RegisterRequest _request = RegisterRequest(mobileNumber, deviceId);
try {
loadingState = RegisterLoadingState.loading;
final _res = await _webApi.register(_request);
loadingState = RegisterLoadingState.done;
_registerResponse = RegisterResponse.fromJson(_res.body as Map<String, dynamic>);
/* I GET ERROR IN THIS LINE -- HiveError: The box "user" is already open and of type Box<User>.*/
final userBox = await Hive.openBox('user');
final user = User(/*...*/);
userBox.putAt(0, user);
}
@action
Future activeAccount(String mobileNumber, String verifyCode) async {
final ActiveAccountRequest _activeAccount = ActiveAccountRequest(mobileNumber, verifyCode);
final userBox = await Hive.openBox('user');
final User currentUser = userBox.getAt(0) as User;
final user = User(/*...*/);
userBox.putAt(0, user);
}
}
1条答案
按热度按时间zu0ti5jz1#
你可以打开你的
user
盒子里的main
应用程序的方法:访问之前打开的框,如下所示: