Flutter笔记--get_it&injectable

Flutter开发中,get_it是Flutter中主流服务定位器,属于手动依赖注入库。它能够实现全局容器,注册对象,随处直接获取实例,不需要层层构造函数传参。injectable是get_it代码生成工具,配套build_runner,自动生成get_it注册代码。简单总结如下:

API:

get_it作用:1 管理对象生命周期:单例、工厂、懒加载单例 2 解耦:业务逻辑、Repository、Dio、数据库实例

injectable作用: 1 注解驱动:@injectable、@singleton标记类,自动生成注册逻辑 2 自动解析构造函数依赖:A 依赖 B,不需要手动写getIt.get<B>()传参

两者关系:injectable只是代码生成器,底层完全依赖 get_it

栗子:

Dart 复制代码
 dependencies:
   get_it: ^7.6.0
   injectable: ^2.1.0
 dev_dependencies:  
   injectable_generator: ^2.1.0
Dart 复制代码
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:get_it/get_it.dart';


class ApiService {
  String fetchData() {
    return "来自ApiService的数据";
  }
}

class UserRepository {
  final ApiService api;
  UserRepository(this.api);

  String getUserInfo() {
    return api.fetchData()+" | 用户仓库处理完成";
  }
}

final getIt = GetIt.instance;

void setUpDi() {
  getIt.registerSingleton<ApiService>(ApiService());
  getIt.registerFactory<UserRepository>(() => UserRepository(getIt<ApiService>()));
}

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

class MyApp extends StatelessWidget {

  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
       home: Scaffold(appBar: AppBar(title: const Text("get_it Demo"),),
       body: Center(
         child:  ElevatedButton(onPressed: (){
             final repo = getIt<UserRepository>();
             print("=====>>>>"+repo.getUserInfo());
           }
           , child: const Text("调用仓库服务")),
       ),
       ),
    );
  }

}
Dart 复制代码
import 'package:get_it/get_it.dart';
import 'package:injectable/injectable.dart';
import 'injector.config.dart';


final getIt = GetIt.instance;

@InjectableInit(
  initializerName:'initGetIt',
  preferRelativeImports:true,
)

void configureDependencies() => getIt.initGetIt();

必须执行生成命令,才会生成injector.config.dart(自动生成,不要手动修改)

dart run build_runner build(或者flutter pub run build_runner build --delete-conflicting-outputs)

Dart 复制代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:injectable/injectable.dart';
import 'package:test_251117/2608/injector.dart';

@singleton
class DioClient {
   String getResponse() {
     return "DioClient:网络请求返回";
   }
}

@Injectable()
class ArticleRepository {
  final DioClient  dioClient;
  ArticleRepository(this.dioClient);
  
  String loadArticle() {
    return dioClient.getResponse() + " → 文章仓库处理完毕";
  }
}

void main()
{
  configureDependencies();
  runApp(const MyTestInject());
}

class MyTestInject extends StatelessWidget {
  const MyTestInject({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatelessWidget {
  HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("get_it + injectable Demo")),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () {
              final repo = getIt<ArticleRepository>();
              debugPrint(repo.loadArticle());
            },
            child: const Text("获取文章数据"),
          ),
          const SizedBox(height: 20),
          ElevatedButton(
            onPressed: () {
              final dio = getIt<DioClient>();
              debugPrint(dio.getResponse());
            },
            child: const Text("调用网络客户端"),
          )
        ],
      ),
    );
  }
}

注意:

1 禁止注册 Widget、State、BuildContext

2 注解区分 2.1 @singleton:对应registerSingleton,启动即创建实例。 2.2 @Injectable():默认生成registerLazySingleton,第一次获取才实例化。

相关推荐
2601_9498477513 小时前
Form-data 跨端三方库仓颉适配全流程
前端·javascript·flutter
大龄秃头程序员16 小时前
Flutter 中我为什么把 GetX 定位为高效率方案,而不是默认架构方案
flutter
传奇开心果编程18 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
2501_944521591 天前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
大龄秃头程序员1 天前
Flutter 架构里总被混淆的 IoC、DI、Service Locator,到底是什么关系?
flutter
事圆则缓2 天前
Flutter 与原生交互的最后一层:RTC 视频帧怎么走
flutter·音视频·实时音视频
2601_949847752 天前
jose 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_949970692 天前
msgpackr 跨端三方库仓颉适配全流程
前端·javascript·flutter
2601_949970692 天前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
传奇开心果编程2 天前
【Flutter踩坑排雷】第3课:const 误用坑|const 错误使用引发 UI 异常与性能损耗
flutter·移动开发·跨平台·dart·编程语言理论·编程框架·声明式ui