首页 > 解决方案 > 每次我从任何页面返回时,Flutter 都会带我进入 MainPage(根页面(/))

问题描述

每次我从任何页面返回时,Flutter 都会带我进入 MainPage(根页面(/))

main.dart

这是我的应用程序主页

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'routes.dart' as router;

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
     return MaterialApp(
        debugShowCheckedModeBanner: false,
        onGenerateRoute: router.generateRoute,
        title: "Leuke App",
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
    ),
      );
    }
 }

routes.dart

这是我的申请路线

import 'package:flutter/material.dart';
import 'package:leukeApp/pages/Login.dart';
import 'package:leukeApp/pages/MyProfile.dart';
import 'package:leukeApp/pages/SignUpDOB.dart';
import 'package:leukeApp/pages/SignUpOTP.dart';
import 'package:leukeApp/pages/SignUpSendOTP.dart';
import 'package:leukeApp/pages/SlidingUpPanelContainer.dart';
import 'package:leukeApp/pages/VideoRecorder.dart';
import 'package:leukeApp/pages/editProfile.dart';
import 'package:leukeApp/pages/MainPage.dart';
import 'package:leukeApp/pages/SignUpPage.dart';

Route<dynamic> generateRoute(RouteSettings settings) {
  var arguments = settings.arguments;
  switch (settings.name) {
    case '/':
      return MaterialPageRoute(builder: (context) => MainPage());
    case 'login':
      return MaterialPageRoute(builder: (context) => Login());
    case 'sing-up':
      return MaterialPageRoute(builder: (context) => SignUpPage());
    case 'sign-up-dob':
      return MaterialPageRoute(builder: (context) => SignUpDOB());
    case 'login':
      return MaterialPageRoute(builder: (context) => Login());
    case 'sign-up-send-otp':
      return MaterialPageRoute(builder: (context) => SignUpSendOTP(arguments));
    case 'sign-up-otp':
      return MaterialPageRoute(builder: (context) => SignUpOTP(arguments));
    case 'home':
      return MaterialPageRoute(builder: (context) => HomePage());
    case 'camera':
      return MaterialPageRoute(builder: (context) => VideoRecorder());
    case 'edit-profile':
      return MaterialPageRoute(builder: (context) => EditProfile());
    case 'my-profile':
      return MaterialPageRoute(builder: (context) => MyProfile());
    default:
  }
}

MainPage.dart

这是我的应用程序主页,显示闪屏并检查用户是否登录然后转到主页其他明智的登录页面导入'dart:async';

import 'package:connectivity/connectivity.dart';
import 'package:flutter/material.dart';
import 'package:leukeApp/services/SessionManager.dart';

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  var loggedInUser = new Map();
  final SessionManager sessions = new SessionManager();
  @override
  void initState() {
    super.initState();
    checkInternetConnection(true);
  }

  redirectToLoginOrHome() async {
    await sessions.getUserInfo().then((checkLoggedInUservalue) {
      loggedInUser = checkLoggedInUservalue;
      if (loggedInUser['user_id'] > 0) {
    setState(() {
      Navigator.pushNamed(context, 'home');
    });
      } else {
    setState(() {
      Navigator.pushNamed(context, 'login');
    });
      }
    });
  }

  Widget dialogContent(BuildContext context) {
    return Container(
      margin: EdgeInsets.only(left: 0.0, right: 0.0),
      child: Stack(
    children: <Widget>[
      Container(
        padding: EdgeInsets.only(
          top: 18.0,
        ),
        margin: EdgeInsets.only(top: 13.0, right: 8.0),
        decoration: BoxDecoration(
        color: Color(0xff2e2f34),
        shape: BoxShape.rectangle,
        borderRadius: BorderRadius.circular(16.0),
        boxShadow: <BoxShadow>[
          BoxShadow(
            color: Colors.black26,
            blurRadius: 0.0,
            offset: Offset(0.0, 0.0),
          ),
        ]),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
        Center(
            child: Container(
          height: 80,
          width: 80,
          decoration: new BoxDecoration(
            image: new DecorationImage(
              image: new AssetImage("assets/images/no-internet.png"),
              fit: BoxFit.cover,
            ),
          ),
        ) //
            ),
        Center(
            child: Padding(
          padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
          child: new Text("Internet Connection Error",
              style: TextStyle(
              fontSize: 20.0,
              color: Color(0xfff5ae78),
              fontWeight: FontWeight.bold)),
        ) //
            ),
        Center(
            child: Padding(
          padding: const EdgeInsets.fromLTRB(10, 10, 10, 0),
          child: new Text(
              "Please check your internet connectivity and try again",
              textAlign: TextAlign.center,
              style: TextStyle(
            fontSize: 15.0,
            color: Colors.white,
              )),
        ) //
            ),
        Padding(
          padding: const EdgeInsets.all(20.0),
          child: RaisedButton(
            padding: EdgeInsets.all(0),
            child: Container(
              height: 45,
              decoration: BoxDecoration(
              gradient: LinearGradient(
            colors: [Color(0xffec4a63), Color(0xff7350c7)],
            begin: FractionalOffset(0.0, 1),
            end: FractionalOffset(0.4, 4),
            stops: [0.1, 0.7],
              )),
              child: Center(
            child: Text(
              'Retry',
              style: TextStyle(
                color: Colors.white,
                fontSize: 20,
                fontFamily: 'RockWellStd',
              ),
            ),
              ),
            ),
            onPressed: () {
              checkInternetConnection(false);
            },
          ),
        ),
          ],
        ),
      ),
    ],
      ),
    );
  }

  checkInternetConnection(bool showPopup) async {
    var connectivityResult = await (Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.none) {
    if (showPopup) {
      showDialog(
    context: context,
    builder: (BuildContext context) => Dialog(
      shape:
          RoundedRectangleBorder(borderRadius: BorderRadius.circular(16.0)),
      elevation: 0.0,
      backgroundColor: Colors.transparent,
      child: dialogContent(context),
    ),
      );
    }
    } else {
      Timer(Duration(milliseconds: 700), () => redirectToLoginOrHome());
    }
  }

  @override
  Widget build(BuildContext context) {
    return Stack(children: <Widget>[
      Container(
    height: MediaQuery.of(context).size.height,
    width: MediaQuery.of(context).size.width,
    color: Color(0XFF15161a),
      ),
      Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Container(
          child: Image.asset(
        'assets/images/gif-logo.gif',
        width: 200,
          ),
        ),
        SizedBox(
          height: 40,
        ),
        Container(
          child: Image.asset(
        'assets/images/logo-name.gif',
        width: 200,
          ),
        )
      ],
    ),
      )
    ]);
  }
}

标签: flutter

解决方案


这里的问题是 Navigator.pushNamed() 中使用的主页面的上下文从未改变。当前context页面的

MaterialPageRoute(builder: (context) => MainPage());

将当前页面添加到路由堆栈。可以在文档中阅读更多详细信息。


推荐阅读