【问题标题】:Flutter: Navigation issue颤振:导航问题
【发布时间】:2019-07-01 06:45:49
【问题描述】:

我无法导航屏幕显示错误“使用不包含导航器的上下文请求导航器操作,我尝试了许多解决方案,其中导航器在Builder 和@987654322 中使用@ 小部件,但这里的导航是在 override 方法中的 intiSate 中的几秒钟后自动完成的。我的目标是几秒钟后导航屏幕。

class Splash extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return testWidget;
      }
    }

Widget testWidget = new MediaQuery(
    data: new MediaQueryData(),
    child: new MaterialApp( title: 'xxxxxxxxxxxxx',
      home: SplashScreen(),
      debugShowCheckedModeBanner: false,
      routes: <String, WidgetBuilder>{
        '/login': (BuildContext context) => new Login(),
      },
    )

);

class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => new _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen>  {
  @override
  Future initState ()  {
    super.initState();
   new Future.delayed(
        const Duration(seconds: 2), () => Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => Login()),
        ));
  }
  @override
  Widget build(BuildContext context) {

    return(Scaffold(
      body: Container(
        height: double.infinity,
        width: double.infinity,
        child: Image.asset('assets/images/crop.jpg',fit:BoxFit.fill),
      ),
    ));
    //build
  }
}

显示错误

使用不包含导航器的上下文请求导航器操作。 用于从 Navigator 推送或弹出路由的上下文必须是作为 Navigator 小部件后代的小部件的上下文。

【问题讨论】:

    标签: android dart flutter


    【解决方案1】:

    代码更正:

    MaterialApp 应该始终是所有 Widget 的 Root Widget。 这样导航器始终可用。

    void main() => runApp(Splash());
    
    class Splash extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: testWidget,
          debugShowCheckedModeBanner: false,
        );
      }
    }
    
    Widget testWidget =
        new MediaQuery(data: new MediaQueryData(), child: new SplashScreen());
    
    class SplashScreen extends StatefulWidget {
      @override
      _SplashScreenState createState() => new _SplashScreenState();
    }
    
    class _SplashScreenState extends State<SplashScreen> {
      @override
      void initState() {
        super.initState();
        Future.delayed(
            const Duration(seconds: 2),
            () => Navigator.pushReplacement(
                  context,
                  MaterialPageRoute(builder: (context) => Login()),
                ));
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Spalsh'),),
          body: Container(
            height: double.infinity,
            width: double.infinity,
    //        child: Image.asset('assets/images/crop.jpg', fit: BoxFit.fill),
          ),
        );
        //build
      }
    }
    
    class Login extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Login Page'),
          ),
          body: Container(),
        );
      }
    }
    

    【讨论】:

    • 延迟是故意的 - 它的启动画面 -
    • 啊,好吧,对不起,我错过了;-(
    • @pskink 是的 - 我知道 - 我是 Flutter 标签的意思 -
    猜你喜欢
    • 2020-07-14
    • 2021-11-24
    • 2021-06-12
    • 2019-06-04
    • 2020-10-10
    • 1970-01-01
    • 2019-12-16
    • 2020-08-22
    • 2018-10-11
    相关资源
    最近更新 更多