【发布时间】:2021-04-04 15:15:43
【问题描述】:
我不熟悉使用 ChangeNotifier 和 MVVM 设计模式的提供程序构建应用程序。当登录页面加载时,我想检查它是否已经登录。如果它已经登录,则导航到下一页。但它显示以下错误。
来自初始屏幕的我的 ChangeNotifier 绑定代码
_moveToNextScreen() async {
await Navigator.pushReplacement(context,
MaterialPageRoute(
builder: (context) =>
ChangeNotifierProvider(
create: (_) => LoginViewModel(),
child: LoginScreen(),
),
));
}
登录屏幕代码
class _LoginScreenState extends State<LoginScreen> {
LoginViewModel _loginViewModel;
//controller for login
TextEditingController _usernameController = TextEditingController();
TextEditingController _passwordController = TextEditingController();
Size size; // calculate screen size
@override
void initState() {
_loginViewModel = Provider.of<LoginViewModel>(context, listen: false);
_loginViewModel.loggedInOrNot();
checkLoginStatus();
super.initState();
}
checkLoginStatus() async {
print('vcal - ${_loginViewModel.getIsLoggedIn}');
if (_loginViewModel.getIsLoggedIn == true) {
//_moveToNextScreen();
}
}
@override
Widget build(BuildContext context) {
_loginViewModel = Provider.of<LoginViewModel>(context);
size = MediaQuery.of(context).size;
return Scaffold(
backgroundColor: green,
//IP screen
// Asset Tracker- Text
body: _loginScreen(),
);
}
我的 LoginViewModel.dart
class LoginViewModel extends ChangeNotifier{
LoginRepository _loginRepository = LoginRepository();
bool _isLoading = false;
bool _isLoggedIn = false;
void loggedInOrNot() async {
_isLoggedIn = !_isLoggedIn;
//await _loginRepository.checkToken();
notifyListeners();
}
bool get getIsLoggedIn => _isLoggedIn;
bool get getIsLoading => _isLoading;
}
我该如何解决这个问题?
【问题讨论】:
-
我认为你必须在那里使用
ChangeNotifierProvider.value或ProxyProvider但我建议在那里使用_loginViewModel.getIsLoggedIn?page1:page2之类的条件 -
如果我调用 _loginViewModel.getIsLoggedIn 它返回 false。它不检查loggedInorNot。我如何分配 _isLoadedIn 的值来等待返回 bool 值的 _loginRepository.checkToken()。
-
你应该在你的登录仓库中使用 provider 我想我发现这段代码可能会有所帮助github.com/itsatifsiddiqui/providerLogin/blob/master/lib/model/…
标签: flutter dart mvvm provider