2

我目前在我的应用程序中使用getFlutter 包(https://pub.dev/packages/get)和以下状态场景有很多问题:

例如,我有一个 GetxController UserController。我在不同的小部件中需要这个控制器,所以我Get.put()在第一个小部件中初始化它,对于其他子小部件,我会用Get.find(). 这样可行。

但是:我有一些小部件有时会在控制器初始化之前加载,有时会在之后加载。所以我得到了很多"UsersController" not found错误。也许这个问题存在一些解决方法?

4

5 回答 5

3

尝试添加

GetMaterialApp(
  smartManagement: SmartManagement.keepFactory,
)

这样它就可以存储那些实例的工厂

或确保添加permanent

Get.put<Repo>(Repo(), permanent: true);

这样它就永远不会从内存中删除

于 2020-11-13T17:13:50.323 回答
2

UsersController您可以在应用程序启动之前使用 Bindings 类初始化您的类。

例子

class UsersController extends GetxController {
  static UsersController get i => Get.find();
  int userId = 5;
}

class UsersBinding extends Bindings {
  @override
  void dependencies() {
    Get.put<UsersController>(UsersController());
  }
}

void main() async {
  UsersBinding().dependencies();
  runApp(MyApp());
}

通过这种方式,您的 UsersController 可以保证在您的应用程序中的任何地方都可用,在任何小部件加载之前。

class MyHomePage extends StatelessWidget {
  final UsersController uc = Get.find();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetX Bindings'),
      ),
      body: Center(
        child: Obx(() => Text('userId: ${uc.userId}')),
      ),
    );
  }
}
于 2020-11-15T05:21:58.740 回答
1

如果您需要检查类是否已初始化,您通常将类保存在内存中permanent:true并在函数中设置tag:'anything you want for check this object' 属性Get.put,现在您可以检查

bool Get.isRegistered<className>(tag: 'TagInPut')

于 2021-04-17T08:24:54.203 回答
0

如果没有特殊原因,您可以在 main 函数中调用 Get.put(UserController()) 并使用 GetMaterialApp 包装材质应用程序。

于 2021-01-30T07:36:33.043 回答
-1

如果您使用get在您的应用程序中提供某个实例,那么https://pub.dev/packages/get_it可以帮助您更多。只要确保你使用allowReassignment==true了这样你就可以更新你的实例,如果你想保存一个全新的控制器,但是如果你想使用相同的总是 get_it 对你来说是完美的

于 2020-11-13T17:09:45.770 回答