Flutter Widget 之package:get_it

737 阅读1分钟

在Flutter中,我们经常细化你说所有的东西都是一个widget,实际上这并不准确,有些诸如数据库连接或来自设备的数据流的东西,可以不使用BuildContext而安全地访问。

为了组织你如何初始化这些类并从你的widget中访问它们,可以尝试像get_it这样的服务定位器

为开始,你可以注册一个应用程序以后会需要的类,然后,当你需要它时再向它索取

// Do this before your app starts
GetIt.I.registerSingleton<MyDatabase>(
    MyDatabase(),
);

// Then start your app!
runApp(MyApp());

finalMyDatabse db = GetIt.I.get<MyDatabase>();

那么那些在你需要之前不因该被初始化的类呢

比如一个特定于页面的状态管理助手? 调用registerFactory方法,以同样的方式检索你的实例

GetIt.I.registerFactory<MyBloc>(
    () => MyBloc(),
);

final myBloc = GetIt.I.get<MyBloc>();

你问,这一切是如何使用你的应用程序变得更清洁的?

get_it使得依赖注入更加顺畅

例如,有一个技巧是注册一个辅助工具的真实和测试版本

if (testing) {
    GetIt.I.registerSingleton<MyHelper>(
        MyHelperMock(),
    );
} else {
    GetIt.I.registerSingle<MyHelper>(
        MyHelperReal(),
    );
}

然后让你的widget对发生的事情一无所知

class MyWidget extends StatelessWidget {
    const MyWidget({Key? key}) : helper = GetIt.I.get<MyHelper>(), super(key: key);
    
    final MyHelper helper;
}

现在你的新widget已经准备好被测试了

当只有大多数东西都是widget时,尝试get_it来定位那些不是的东西

如果想了解有关package:get_it 的内容,或者关于Flutter的其他功能,请访问pu b.dev

原文翻译自视频:视频地址