Flutter:从小部件重定向到另一个页面

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)

eam*_*ein 5

您在构建方法中调用异步函数是错误的。尝试这个:

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)