Flutter扩展插件extensions的功能介绍

发布于 1周前 作者 sinazl 来自 Flutter

Flutter扩展插件extensions的功能介绍

本文将详细介绍 flutter_extensions 插件中的几个核心功能,包括配置管理、依赖注入、日志记录以及通用主机功能。

配置管理

flutter_extensions 提供了一种简便的方式来管理应用程序的配置。以下是一个简单的例子:

import 'package:extensions/configuration.dart';

void main() {
  var configurationBuilder = ConfigurationBuilder()
    // 添加一个内存中的配置集合
    ..addInMemoryCollection(
      <String, String>{
        'Logging:LogLevel:Default': 'Warning',
      }.entries,
    );

  var config = configurationBuilder.build();
  print(config['Logging:LogLevel:Default']); // 输出 "Warning"
}

依赖注入

flutter_extensions 还支持依赖注入,使得组件之间的解耦更加容易。以下是一个简单的依赖注入示例:

import 'package:extensions/dependency_injection.dart';

class MyService {}

void main() {
  var serviceCollection = ServiceCollection();
  serviceCollection.addSingleton<MyService>(
    implementationInstance: MyService(),
  );
  var services = serviceCollection.buildServiceProvider();
  var myService = services.getRequiredService<MyService>();
}

在这个例子中,我们创建了一个 ServiceCollection 对象,并向其中添加了一个单例服务 MyService。然后我们构建了服务提供器,并从中获取了 MyService 的实例。

日志记录

flutter_extensions 提供了日志记录功能,方便开发人员调试和跟踪应用行为。以下是一个简单的日志记录示例:

import 'package:extensions/logging.dart';

void main() {
  LoggerFactory.create(
    (builder) => builder
      ..addDebug()
      ..setMinimumLevel(LogLevel.debug),
  ).createLogger('MyLogger').logDebug('Hello World');
}

上述代码使用 LoggerFactory 创建了一个名为 MyLogger 的日志记录器,并记录了一条调试级别的日志消息。输出将显示在调试窗口中:

[MyLogger] LogLevel.debug: Hello World

通用主机

flutter_extensions 还提供了一个通用主机框架,用于简化应用程序的启动过程。以下是一个简单的示例:

import 'package:extensions/hosting.dart';

Future<void> main(List<String> args) async =>
    await Host.createDefaultBuilder(args)
        .useConsoleLifetime()
        .build()
        .run();

以上代码展示了如何使用 Host.createDefaultBuilder 方法来创建一个默认的主机,并设置控制台生命周期管理器。最后通过 .run() 方法启动主机。

完整示例Demo

以下是一个完整的示例,展示如何结合使用这些功能:

import 'package:extensions/hosting.dart';
import 'package:extensions/src/hosting/hosting_host_builder_extensions_io.dart';

class ExampleHostedService extends HostedService {
  final Logger _logger;

  ExampleHostedService(
    Logger logger,
    HostApplicationLifetime lifetime,
  ) : _logger = logger {
    lifetime
      ..applicationStarted.register((_) => _onStarted())
      ..applicationStopping.register((_) => _onStopping())
      ..applicationStopped.register((_) => _onStopped());
  }

  [@override](/user/override)
  Future<void> start(CancellationToken cancellationToken) async {
    _logger.logInformation('1. Start has been called.');
    return;
  }

  [@override](/user/override)
  Future<void> stop(CancellationToken cancellationToken) async {
    _logger.logInformation('4. Stop has been called.');
    return;
  }

  void _onStarted() {
    _logger.logInformation('2. OnStarted has been called.');
  }

  void _onStopping() {
    _logger.logInformation('3. OnStopping has been called.');
  }

  void _onStopped() {
    _logger.logInformation('5. OnStopped has been called.');
  }
}

Future<void> main(List<String> args) async => 
    await Host.createDefaultBuilder(args)
        .configureServices(
          (_, services) => services.addHostedService<ExampleHostedService>(
            (services) => ExampleHostedService(
              services
                  .getRequiredService<LoggerFactory>()
                  .createLogger('ExampleHostedService'),
              services.getRequiredService<HostApplicationLifetime>(),
            ),
          ),
        )
        .useConsoleLifetime(null)
        .build()
        .run();

更多关于Flutter扩展插件extensions的功能介绍的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter扩展插件extensions的功能介绍的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于Flutter扩展插件(extensions)功能介绍的回复,并附带了一些相关的代码案例。


Flutter扩展插件(Extensions)功能介绍

Flutter扩展插件允许开发者在Flutter应用中集成自定义的、可扩展的功能,从而增强应用的灵活性和功能性。这些扩展插件通常用于添加平台特定的功能(如访问设备硬件、系统服务等),或者实现一些特定的UI组件和交互逻辑。

在Flutter中,扩展插件可以通过多种方式实现,包括使用Dart代码编写原生平台通道(platform channels),或者利用现有的第三方插件库。下面,我将通过几个代码案例来展示Flutter扩展插件的一些常见功能。

案例1:访问设备相机

使用camera插件访问设备相机并显示实时预览。

首先,在pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  camera: ^0.10.0+1  # 请根据需要替换为最新版本

然后,在Dart代码中实现相机预览:

import 'package:flutter/material.dart';
import 'package:camera/camera.dart';

List<CameraDescription> cameras;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  cameras = await availableCameras();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Camera App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CameraApp(),
    );
  }
}

class CameraApp extends StatefulWidget {
  @override
  _CameraAppState createState() => _CameraAppState();
}

class _CameraAppState extends State<CameraApp> {
  CameraController? controller;

  @override
  void initState() {
    super.initState();
    if (cameras.isEmpty) {
      return;
    }
    controller = new CameraController(
      cameras[0],
      ResolutionPreset.medium,
      enableAudio: true,
    );
    controller!.initialize().then((_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (controller == null || !controller!.value.isInitialized) {
      return Container();
    }
    return CameraPreview(controller!);
  }
}

案例2:访问文件系统

使用path_provider插件访问设备的文件系统,如获取应用文档目录的路径。

pubspec.yaml中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  path_provider: ^2.0.8  # 请根据需要替换为最新版本

在Dart代码中获取应用文档目录的路径:

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Path Provider Demo'),
        ),
        body: Center(
          child: FutureBuilder<String>(
            future: getApplicationDocumentsDirectory(),
            builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text("Error: ${snapshot.error}");
                } else {
                  return Text("Application documents directory: ${snapshot.data}");
                }
              } else {
                return Text("Loading...");
              }
            },
          ),
        ),
      ),
    );
  }
}

案例3:平台通道实现自定义功能

通过平台通道实现一个简单的原生功能调用,例如从原生Android或iOS代码中返回一个字符串。

首先,在Dart代码中定义平台通道:

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

const platform = MethodChannel('com.example.myapp/channel');

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Platform Channel Demo'),
        ),
        body: Center(
          child: FutureBuilder<String>(
            future: platform.invokeMethod('getPlatformVersion'),
            builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text("Error: ${snapshot.error}");
                } else {
                  return Text("Platform version: ${snapshot.data}");
                }
              } else {
                return Text("Loading platform version...");
              }
            },
          ),
        ),
      ),
    );
  }
}

在Android原生代码中实现平台通道:

// MainActivity.java
package com.example.myapp;

import android.os.Bundle;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
  private static final String CHANNEL = "com.example.myapp/channel";

  @Override
  public void configureFlutterEngine(FlutterEngine flutterEngine) {
    super.configureFlutterEngine(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
        .setMethodCallHandler(
          (call, result) -> {
            if (call.method.equals("getPlatformVersion")) {
              String platformVersion = android.os.Build.VERSION.RELEASE;
              result.success(platformVersion);
            } else {
              result.notImplemented();
            }
          }
        );
  }
}

在iOS原生代码中实现平台通道:

// AppDelegate.swift
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let channel = FlutterMethodChannel(name: "com.example.myapp/channel", binaryMessenger: controller)
    channel.setMethodCallHandler({
      (call: FlutterMethodCall, result: @escaping FlutterResult) in
      if (call.method == "getPlatformVersion") {
        let version = UIDevice.current.systemVersion
        result(version)
      } else {
        result(FlutterMethodNotImplemented)
      }
    })
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

这些代码案例展示了Flutter扩展插件在访问设备硬件、文件系统以及实现自定义平台功能方面的应用。通过这些插件和平台通道,开发者可以轻松地扩展Flutter应用的功能,实现更加丰富的用户体验。

回到顶部