使用Getx开发Todo应用遇HomeController未找到错误求助
问题解决:HomeController找不到的错误修复
错误原因
问题出在MyApp继承了GetViewGet.find<HomeController>()获取控制器实例,但这个获取操作在initialBinding执行前就触发了;另外当跳转Login页面时,Login页面不需要HomeController,但MyApp作为根组件却强制查找该控制器,最终导致报错。
顺带提一句,你main函数里重复写了两次await GetStorage.init()和await Get.putAsync(() => StorageService().init()),属于冗余代码,建议删掉重复的部分。
修复方案
方案1:去掉MyApp的GetView继承(推荐)
MyApp作为根组件,不需要直接依赖HomeController,改成普通StatelessWidget即可:
class MyApp extends StatelessWidget { // 将GetView替换为StatelessWidget const MyApp({ Key? key, }) : super(key: key); @override Widget build(BuildContext context) { SystemChrome.setSystemUIOverlayStyle( SystemUiOverlayStyle(statusBarColor: Colors.transparent)); return ScreenUtilInit( designSize: const Size(360, 800), minTextAdapt: true, splitScreenMode: true, builder: (context, child) { return GetMaterialApp( debugShowCheckedModeBanner: false, title: 'Flutter Demo', theme: Themes.light, darkTheme: Themes.dark, themeMode: ThemeMode.light, home: isViewed != 0 ? Login() : Report(), initialBinding: HomeBinding(), builder: EasyLoading.init(), ); }); } }
方案2:提前初始化HomeController
如果一定要保留GetView,可以在main函数runApp之前提前初始化控制器,确保MyApp构建时能找到实例:
// 在runApp(MyApp());之前添加 Get.lazyPut(() => HomeController( taskRepository: TaskRepository( taskProvider: TaskProvider(), ), ));
额外注意点
要实现登录页面仅显示一次,需确保登录成功后执行以下代码:
SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setInt('login', 0);
这样下次启动App时就会直接进入Report页面。
内容的提问来源于stack exchange,提问作者Pankaj Subedi
相关产品推荐
相关产品推荐

