首页 > 解决方案 > Flutter:根据情况调用不同的页面(登录或未登录的用户)

问题描述

我的应用程序有问题。

情况是:我在应用程序上有一个非常简单的登录系统,我使用 SharedPreferences 保存登录的用户。但是,如果用户离开应用程序然后返回,它将再次打开登录屏幕,所以如果用户已登录,我想跳过登录屏幕。

因此,在我的主要功能中,我放置了一个函数来检查是否有登录信息,如果有,它将直接重定向到应用程序页面,如果没有,则重定向到登录页面。但是当我尝试调用应用程序页面时,它总是调用在主页部分设置的页面。

我该如何解决这个问题?有什么办法让它忽略主页吗?有没有办法在家里制作“如果”部分?将是更好的解决方案,但这是不可能的。

我也知道我没有使用最好的方法来制作这个控件,但它可以工作(尽管我现在有这个问题,当然),如果你有任何让它变得更好的提示,我将不胜感激。

这是我的代码:


class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

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

class _MyAppState extends State<MyApp> {
  Future<void> verificaLogin() async {
    print("running ok"); //just to test if the function runs
    final prefs = await SharedPreferences.getInstance();
    final key = 'usuario';
    final value = prefs.getString(key);
    print('saved tester $value');
    String usu = value; /

    if (usu.isEmpty) {
      BuildContext context;
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => LoginScreen()), //sends to loginscreen if not logged
      );
    }
    if (usu.isNotEmpty) {
      BuildContext context;
      Navigator.of(context)
          .pushReplacement(MaterialPageRoute(builder: (context) => Pedidos())); //sends to main (not main.dart) app page
    }
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) => verificaLogin());
  }

  Widget build(BuildContext context) {
    return BotToastInit(
      child: MaterialApp(
        navigatorObservers: [BotToastNavigatorObserver()],
        title: "Test App",
        theme: ThemeData(
          primarySwatch: Colors.green,
        ),
        debugShowCheckedModeBanner: false,
        home: LoginScreen(), //i'm calling the loginscreen, it ignores the function on the top
      ),
    );
  }
}


标签: androidflutter

解决方案


请制作一个像下面这样的 SplashScreen 它可以解决您的问题..
并将其称为 home: SplashScreen(),

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

class _SplashScreenState extends State<SplashScreen> {
  String loginData = "";

  SharedPreferences sharedPreferences;
  void initState() {
    super.initState();
    readFromStorage();
  }

  void readFromStorage() async {
    sharedPreferences = await SharedPreferences.getInstance();
    final key = 'usuario';
    loginData = sharedPreferences.getString(key);

    if (loginData.isNotEmpty) {
      Future.delayed(const Duration(milliseconds: 3000), () {
        setState(() {
          Navigator.of(context)
      .pushReplacement(MaterialPageRoute(builder: (context) => Pedidos()));
        });
      });
    } else {
      Future.delayed(const Duration(milliseconds: 3000), () {
        setState(() {
           Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => LoginScreen()),);
        });
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          FlutterLogo(
            size: 100.0,
          ),
        ],
      )),
    );
  }
}

推荐阅读