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,第一次获取才实例化。

相关推荐
●VON4 小时前
Flutter 鸿蒙插件适配实战:用 device_screen_brightness 2.0.0 控制并监听屏幕亮度
flutter·华为·harmonyos
风早爽太12 小时前
Flutter 开发笔记:share_plus 分享插件
笔记·flutter
●VON12 小时前
Flutter 鸿蒙插件适配实战:用 boot_time_plugin 1.0.0 读取启动时间与运行时长
flutter·华为·harmonyos
不羁的木木15 小时前
给鸿蒙 App 增加唤起系统邮件发送能力 —— flutter_email_sender 的鸿蒙使用指南
flutter·华为·harmonyos
●VON15 小时前
Flutter 鸿蒙插件适配实战:用 accurate_storage_info 0.1.1 查询总量、可用量与已用量
flutter·华为·harmonyos
●VON16 小时前
Flutter 鸿蒙插件适配实战:用 network_status_bridge 0.0.5 查询并监听默认网络
网络·flutter·华为·harmonyos·鸿蒙
安好说AI17 小时前
Flutter for OpenHarmony 实战:媒体选择库 adaptive_image_picker 的鸿蒙化适配全解读
flutter·harmonyos·媒体
恋猫de小郭17 小时前
ADB Wi-Fi 2.0 ,Android 17 把无线调试的连接链路重新做了一遍
android·前端·flutter
●VON18 小时前
Flutter 鸿蒙插件适配实战:用 app_version_details 1.0.3 读取版本号与包名
flutter·华为·harmonyos
●VON21 小时前
Flutter 鸿蒙插件适配实战:用 locale_plus 2.0.0 读取语言、地区与格式偏好
flutter·华为·harmonyos·鸿蒙