繁体   English   中英

如何从初始屏幕重定向页面(Flutter)

[英]How to redirect a page from a splash screen (Flutter)

我正在开发一个启动画面,它应该显示一个图像作为页面的背景,然后执行一个 rest 调用,其结果是了解要加载哪个其他页面(登录或主页)所必需的,我不明白为什么重定向不起作用

void main() {
  runApp(const MainPage());
}

// ----------------------------------------------------------------------------
//
// ----------------------------------------------------------------------------
class MainPage extends StatefulWidget {
  const MainPage({Key? key}) : super(key: key);

  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  @override
  void initState() {
    super.initState();
  }

// ----------------------------------------------------------------------------
// Redirect managed from the server
// ---------------------------------------------------------
  Future<void> getRedirectPage(BuildContext context) async {
    await initializeSharedPrefs();
    ServerResponse serverResponse = await makeRequestToServer(Null);
    if (serverResponse.state.compareTo("") != 0) {
      if (serverResponse.state.compareTo("true") == 0) {
        if (serverResponse.redirect.compareTo("login") == 0) {
          Navigator.of(context).pushReplacement(PageRouteBuilder(pageBuilder: (_,__,___)=> LoginPage()));
        } else {
          Navigator.of(context).pushReplacement(PageRouteBuilder(pageBuilder: (_,__,___)=> Homepage()));
        }
      } else {
        showAlertDialog(context, "Server error", "Something went wrong: " + serverResponse.msg);
      }
    } else {
      showAlertDialog(context, "Server error", "Something went wrong: " + serverResponse.msg);
    }
  }

// ----------------------------------------------------------------------------
// Initialization of UI
// ----------------------------------------------------------------------------
  @override
  Widget build(BuildContext context) {
    getRedirectPage(context);

    return MaterialApp(
      title: 'ID - IoT',
      home: Container(
        decoration: const BoxDecoration(
          image: DecorationImage(
            image: AssetImage('assets/images/background.jpeg'),
            fit: BoxFit.cover,
          ),
        ),
      ),
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );
  }
}

这是从 logcat 显示的错误:

E/flutter (18073): [ERROR:flutter/shell/common/shell.cc(93)] Dart Unhandled Exception: Navigator operation requested with a context that does not include a Navigator.

E/flutter (18073): The context used to push or pop routes from the Navigator must be that of a widget that is a descendant of a Navigator 

您正在将上下文传递给不存储导航器的 function(导航器位于材料应用程序内)。 您可以使用构建器小部件。

    return MaterialApp(
      home: Builder(
        builder: (context) {
          getRedirectPage(context);
          return Container();
        },
      ),
    );

或使用导航键,但在这种情况下不安全

    final navKey = GlobalKey<NavigatorState>();

    navKey.currentState!.pop();
    return MaterialApp(
      navigatorKey: navKey,
      home:  Container(),
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM