Flutter插件trent的使用_Trent 是一个简单、反应式、可扩展且有主见的状态管理库

发布于 1周前 作者 zlyuanteng 最后一次编辑是 5天前 来自 Flutter

Flutter插件trent的使用_Trent 是一个简单、反应式、可扩展且有主见的状态管理库

介绍

Trent 是一个简单、反应式、可扩展且有主见的状态管理库。它提供了内置的依赖注入和服务定位器,使得状态管理更加简洁高效。

主要特点

  • 易用性:内置依赖注入和服务定位器。
  • 细粒度控制:提供简化的 watch<T>watchMap<T, S>get<T> 函数,减少样板代码。
  • 性能与安全性:高效的流式状态管理,使用自定义的 Option.Some(...)/Option.None() 类型。

UI 层

Alerter Widget

Alerter 小部件监听业务逻辑层发出的一次性状态 alert(...)。它可以处理临时或一次性的通知(如错误消息或 toast 通知),而不会改变当前状态。

Digester Widget

Digester 小部件根据当前业务逻辑状态动态构建 UI。它提供了一种直观且类型安全的方式来将每个状态映射到相应的 UI 表示。

主要实用函数

  • watch<T>:监听状态变化并动态重建小部件。
  • get<T>:检索 Trent 实例而不监听状态变化。用于调用业务逻辑函数。
  • watchMap<T, S>:根据类型动态地将状态映射到特定的小部件。

业务逻辑层

定义自定义状态类

class WeatherTypes extends EquatableCopyable<WeatherTypes> {
  @override
  List<Object?> get props => [];
}

class NoData extends WeatherTypes {}

class Sunny extends WeatherTypes {
  final double temperature;

  Sunny(this.temperature);

  @override
  List<Object?> get props => [temperature];

  @override
  WeatherTypes copyWith({double? temperature}) {
    return Sunny(temperature ?? this.temperature);
  }
}

class Rainy extends WeatherTypes {
  final double rainfall;

  Rainy(this.rainfall);

  @override
  List<Object?> get props => [rainfall];

  @override
  WeatherTypes copyWith({double? rainfall}) {
    return Rainy(rainfall ?? this.rainfall);
  }
}

创建 Trent 状态管理类

class WeatherTrent extends Trent<WeatherTypes> {
  WeatherTrent() : super(NoData());

  void updateToSunny(double temperature) {
    emit(Sunny(temperature));
  }

  void updateToRainy(double rainfall) {
    emit(Rainy(rainfall));
  }

  void resetState() {
    reset();
  }
}

使用示例

初始化 Trent

main.dart 中初始化 Trent:

void main() {
  runApp(
    TrentManager(
      trents: [
        register(WeatherTrent()),
      ],
      child: const MyApp(),
    ),
  );
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Weather Example App',
      home: const HomeScreen(),
    );
  }
}

在 UI 中调用业务逻辑函数

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: () {
            final weatherTrent = get<WeatherTrent>(context);
            weatherTrent.updateToSunny(30.0);
          },
          child: const Text("Set to Sunny"),
        ),
        ElevatedButton(
          onPressed: () {
            final weatherTrent = get<WeatherTrent>(context);
            weatherTrent.updateToRainy(100.0);
          },
          child: const Text("Set to Rainy"),
        ),
        ElevatedButton(
          onPressed: () {
            final weatherTrent = get<WeatherTrent>(context);
            weatherTrent.resetState();
          },
          child: const Text("Reset Weather State"),
        ),
      ],
    );
  }
}

使用 Alerter 和 Digester

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Alerter<WeatherTrent, WeatherTypes>(
      listenAlerts: (mapper) {
        mapper
          ..as<Error>((alert) {
            ScaffoldMessenger.of(context).showSnackBar(
              SnackBar(content: Text("Alert: ${alert.message}")),
            );
          });
      },
      listenStates: (mapper) {
        mapper
          ..as<Sunny>((state) => print(state))
          ..as<Rainy>((state) => print(state))
          ..orElse((_) => const Text("No Data"));
      },
      child: Digester<WeatherTrent, WeatherTypes>(
        child: (mapper) {
          mapper
            ..as<Sunny>((state) => Text("Sunny: ${state.temperature}°C"))
            ..as<Rainy>((state) => Text("Rainy: ${state.rainfall}mm"))
            ..orElse((_) => const Text("No Data"));
        },
      ),
    );
  }
}

使用 watch 和 watchMap

使用 watch

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final weatherTrent = watch<WeatherTrent>(context);
    final state = weatherTrent.state;

    if (state is Sunny) {
      return Text("Sunny: ${state.temperature}°C");
    } else if (state is Rainy) {
      return Text("Rainy: ${state.rainfall}mm");
    } else {
      return const Text("No Data");
    }
  }
}

使用 watchMap

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return watchMap<WeatherTrent, WeatherTypes>(context, (mapper) {
      mapper
        ..as<Sunny>((state) => Text("Sunny: ${state.temperature}°C"))
        ..as<Rainy>((state) => Text("Rainy: ${state.rainfall}mm"))
        ..orElse((_) => const Text("No Data"));
    });
  }
}

测试 Trent

添加测试以确保您的 Trent 按预期工作:

void main() {
  test('WeatherTrent state transitions', () {
    final trent = WeatherTrent();

    // Initial state
    expect(trent.state, isA<NoData>());

    // Update to Sunny
    trent.updateToSunny(25.0);
    expect(trent.state, isA<Sunny>());
    expect((trent.state as Sunny).temperature, 25.0);

    // Update to Rainy
    trent.updateToRainy(50.0);
    expect(trent.state, isA<Rainy>());
    expect((trent.state as Rainy).rainfall, 50.0);

    // Reset state
    trent.resetState();
    expect(trent.state, isA<NoData>());
  });
}

更多关于Flutter插件trent的使用_Trent 是一个简单、反应式、可扩展且有主见的状态管理库的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件trent的使用_Trent 是一个简单、反应式、可扩展且有主见的状态管理库的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


了解您的需求后,以下是一个关于如何在Flutter项目中集成并使用一个假想的“未知功能”插件(这里以trent作为插件名)的代码示例。由于trent插件的具体功能和API是未知的,我将基于常见的Flutter插件使用模式来编写示例代码。请注意,这个示例是假设性的,实际使用时需要根据trent插件的真实API进行调整。

1. 添加插件依赖

首先,在pubspec.yaml文件中添加trent插件的依赖(假设该插件已经在pub.dev上发布,或者您已经通过其他方式获得了它):

dependencies:
  flutter:
    sdk: flutter
  trent: ^x.y.z  # 替换为实际版本号

2. 导入插件

在您需要使用trent插件的Dart文件中导入它:

import 'package:trent/trent.dart';

3. 初始化插件

假设trent插件需要初始化,您可以在应用启动时进行初始化。通常,这会在MainActivity.kt(对于Android)或AppDelegate.swift(对于iOS)以及Flutter的main.dart文件中进行。

main.dart中初始化(假设需要)

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 假设trent有一个全局的初始化方法
  Trent.initialize();
  
  runApp(MyApp());
}

4. 使用插件功能

由于trent插件的具体功能是未知的,我将展示一个通用的使用模式。假设trent插件提供了一个名为performUnknownFunction的方法,该方法接受一些参数并返回一个结果。

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  Trent.initialize(); // 如果需要初始化
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Trent Plugin Demo'),
        ),
        body: Center(
          child: TrentButton(),
        ),
      ),
    );
  }
}

class TrentButton extends StatefulWidget {
  @override
  _TrentButtonState createState() => _TrentButtonState();
}

class _TrentButtonState extends State<TrentButton> {
  String result = '';

  void performUnknownFunction() async {
    try {
      // 假设performUnknownFunction方法接受一些参数,这里用示例参数
      var response = await Trent.performUnknownFunction(param1: 'value1', param2: 123);
      
      // 更新UI以显示结果
      setState(() {
        result = 'Result: ${response.data}'; // 假设返回的数据在data字段中
      });
    } catch (e) {
      // 处理错误
      setState(() {
        result = 'Error: $e';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: performUnknownFunction,
          child: Text('Perform Unknown Function'),
        ),
        Text(result),
      ],
    );
  }
}

注意事项

  1. 实际API:上述代码中的Trent.initialize()Trent.performUnknownFunction()是假设性的方法。您需要查阅trent插件的实际文档来了解其提供的API。
  2. 错误处理:在调用插件方法时,务必进行错误处理,以确保应用的稳定性。
  3. 平台特定代码:如果trent插件包含平台特定的代码(如原生Android或iOS代码),您可能需要在相应的平台文件夹中添加或修改代码。

希望这个示例能帮助您开始使用trent插件。如果您有具体的插件API文档或更多信息,请提供,以便我能给出更准确的示例。

回到顶部