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

Flutter中使用GetX的Get.find()获取LessonListController报错的问题求助

解决Get.find()找不到LessonListController的问题

嘿,我看你遇到的问题是GetX找不到你的控制器,其实原因很明确:你的依赖初始化逻辑没执行,而且你在GetMaterialApp还没准备好的时候就调用了Get.find()。下面一步步给你解决:

问题根源

  1. 你写的init()方法根本没被调用过,所以LessonListController从来没被注册到Get的依赖树里,Get自然找不到它。
  2. 就算init()执行了,你在MyApp的build方法里直接调用Get.find()也有问题——因为此时GetMaterialApp还没完成初始化,Get的依赖容器还没就绪。
  3. 另外,在build方法里调用接口也不好,因为build会被多次触发,会导致重复请求接口。

解决方案

第一步:确保依赖初始化方法被执行

把init()方法放到main函数里,在runApp之前调用,而且要加async/await(因为你的init是异步方法):

void main() async {
  await init(); // 先初始化所有依赖
  runApp(const MyApp());
}

第二步:把接口调用移到合适的地方

不要在MyApp的build里调用getLessonList(),建议把它移到Diary页面的initState里(如果Diary是StatefulWidget),因为此时GetMaterialApp已经初始化完成,依赖容器可用:

class Diary extends StatefulWidget {
  const Diary({Key? key}) : super(key: key);

  @override
  State<Diary> createState() => _DiaryState();
}

class _DiaryState extends State<Diary> {
  @override
  void initState() {
    super.initState();
    // 这里调用接口是安全的,依赖已经注册完成
    Get.find<LessonListController>().getLessonList();
  }

  @override
  Widget build(BuildContext context) {
    // 你的页面布局代码
    return Scaffold(
      appBar: AppBar(title: const Text("Diary")),
      // 如果要展示lessonList,建议用GetBuilder监听控制器变化
      body: GetBuilder<LessonListController>(
        builder: (controller) {
          if (controller.lessonList.isEmpty) {
            return const Center(child: CircularProgressIndicator());
          }
          return ListView.builder(
            itemCount: controller.lessonList.length,
            itemBuilder: (context, index) {
              // 构建你的列表项
              return ListTile(title: Text(controller.lessonList[index].name));
            },
          );
        },
      ),
    );
  }
}

第三步:修复控制器的UI更新(可选)

你的LessonListController里注释掉了update(),如果要用GetBuilder更新UI的话,记得在_lessonList更新后打开它:

Future<void> getLessonList() async {
  Response response = await lessonListRepo.getLessonList();
  if (response.statusCode == 200) {
    print('got you');
    _lessonList = [];
    _lessonList.addAll(Course.fromJson(response.body).lessons);
    update(); // 打开这个,通知GetBuilder更新UI
  } else {}
}

额外注意点

  • 确保AppConstants.BASE_URL是正确的,否则ApiClient初始化会有问题
  • 如果你想让控制器在整个App生命周期内保持单例,你的Get.lazyPut用法是对的;如果需要页面销毁后重建,可以加fenix: true参数

内容的提问来源于stack exchange,提问作者gramz good

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:42:42