You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何在main入口初始化时调用Provider方法完成登录校验

实现方案

你需要在MultiProvider和MaterialApp之间加一层独立的启动校验组件,拿到注入Provider后的合法上下文,在应用启动第一时间执行登录校验逻辑,替代原来硬编码的初始路由配置。

核心调整点

  • 移除MaterialApp中固定写死的initialRoute,因为初始路由需要等待登录校验结果动态决定
  • 新增启动层组件,在组件初始化阶段调用listarUsuarios()校验方法,校验期间展示加载占位避免白屏
  • 校验完成后根据返回的登录状态,自动重定向到主页或登录页
  • 所有Provider已经设置了lazy: false,启动时会完成全部初始化,不会出现调用方法时Provider未创建的问题

修改后完整main.dart代码

import 'package:amigo_almacen/pages/pages.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'Providers/DataProviders.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => ProductoProvider(), lazy: false),
        ChangeNotifierProvider(create: (_) => ReporteProvider(), lazy: false),
        ChangeNotifierProvider(create: (_) => GestUsuarios(), lazy: false),
        ChangeNotifierProvider(create: (_) => Getcomidas(), lazy: false),
        ChangeNotifierProvider(create: (_) => GetFormReportes(), lazy: false),
        ChangeNotifierProvider(create: (_) => GestRopa(), lazy: false),
        ChangeNotifierProvider(create: (_) => GetBebidas(), lazy: false),
        ChangeNotifierProvider(create: (_) => SessionUser(), lazy: false),
      ],
      child: const AppBootstrap(),
    );
  }
}

// 启动校验层
class AppBootstrap extends StatefulWidget {
  const AppBootstrap({Key? key}) : super(key: key);

  @override
  State<AppBootstrap> createState() => _AppBootstrapState();
}

class _AppBootstrapState extends State<AppBootstrap> {
  @override
  void initState() {
    super.initState();
    // 首帧渲染完成后立刻执行校验,避免组件未初始化时报错
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      // 泛型替换为你实际实现listarUsuarios方法的Provider类即可
      final authProvider = Provider.of<GestUsuarios>(context, listen: false);
      // 执行登录状态校验,方法需返回bool值:已登录返回true,未登录返回false
      final isLoginValid = await authProvider.listarUsuarios();

      // 根据校验结果跳转对应路由
      if (isLoginValid) {
        Navigator.pushReplacementNamed(context, PrincipalPage.routeName);
      } else {
        Navigator.pushReplacementNamed(context, LoginPage.routeName);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(primarySwatch: Colors.indigo),
      title: 'Amigo_Almacen',
      // 校验期间展示加载状态,避免白屏
      home: const Scaffold(
        body: Center(
          child: CircularProgressIndicator(),
        ),
      ),
      routes: {
        //Fredy Nemesio Palomino Huamani
        LoginPage.routeName: (_) => const LoginPage(),
        RegistroPage.routeName: (_) => const RegistroPage(),
        RecuperarPage.routeName: (_) => const RecuperarPage(),
        Recuperar_pages2.routeName: (_) => const Recuperar_pages2(),
        PrincipalPage.routeName: (context) => const PrincipalPage(),
        OptionsForm.routeName: (_) => const OptionsForm(),
        SuccessPage.routeName: (context) => SuccessPage('', '', '', '', ''),
        //Victor Vicente Palomino Torres
        ComidaPage.routeName: (_) => const ComidaPage(),
        //Valentino Gómez Aguirre
        BebidasPage.routeName: (_) => const BebidasPage(),
        //Axel David Chambilla Obregón
        RopaPage.routeName: (_) => const RopaPage(),
        //Anabel Huanca Moreano
        ReportesPage.routeName: (_) => const ReportesPage(),
      },
    );
  }
}

注意事项

  • 读取Provider时必须设置listen: false,避免初始化阶段触发监听刷新报错
  • 如果listarUsuarios()定义在SessionUser类中,只需要把Provider.of<GestUsuarios>的泛型替换为SessionUser即可
  • 可以根据需求替换加载占位组件,换成你的品牌启动页也可以

内容的提问来源于stack exchange,提问作者FREDY NEMESIO PALOMINO HUAMANI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 07:12:52