Saa*_*hir 1 dart flutter flutter-provider
我正在尝试实现一个注销页面。因此,当用户单击导航中的注销按钮时,将调用以下代码:
Class Logout extends StatelessWidget {
@override
Widget build(BuildContext context) {
final provider = Provider.of<SignInProvider>(context, listen: true);
Future.delayed(Duration(seconds: 5), () async {
provider.isLoggedIn = false;
provider.notifyListeners();
Navigator.pushReplacement(
context, new MaterialPageRoute(builder: (context) => LoginGate()));
});
return Center(child: CircularProgressIndicator());
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
The following assertion was thrown building MainScreen(dirty, dependencies: [_InheritedProviderScope<SelectedIndex?>, _InheritedProviderScope<SignInProvider?>], state: _MainScreenState#6a8ce):
setState() or markNeedsBuild() called during build.
Run Code Online (Sandbox Code Playgroud)
我尝试添加延迟,希望能解决问题,但没有帮助。希望获得有关如何处理此问题的帮助。
使用 NavigationRail 显示注销按钮
const NavigationRailDestination(
icon: Icon(Icons.logout),
label: Text('Logout'),
),
Run Code Online (Sandbox Code Playgroud)
使用以下方式调用注销小部件:
child: Row(
children: [
NavigationRailExample(),
const VerticalDivider(thickness: 1, width: 1),
Expanded(
child: screenSwitch[providerSelectedIndex.selectedIndex],
)
],
),
List<Widget> screenSwitch = [
HomeScreen(),
Screen1(),
Screen2(),
Screen3(),
Screen4(),
Screen5(),
Screen6(),
Logout(),
];
Run Code Online (Sandbox Code Playgroud)
您在构建方法中调用异步函数是错误的。尝试这个:
class Logout extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: doLogOut(context),
builder: (context, snapshot) {
return Center(child: CircularProgressIndicator());
},
);
}
Future<void> doLogOut(BuildContext context) async {
final provider = Provider.of<SignInProvider>(context, listen: true);
await Future.delayed(Duration(seconds: 5), () async {
provider.isLoggedIn = false;
provider.notifyListeners();
Navigator.pushReplacement(
context, new MaterialPageRoute(builder: (context) => LoginGate()));
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1117 次 |
| 最近记录: |