Flutter功能扩展插件eagle_provider的使用

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

Flutter功能扩展插件eagle_provider的使用

Eagle Provider 是一个简单的状态管理包,它仅使用 ValueNotifierInheritedWidget

使用

要使用它,只需创建一个状态类和另一个作为状态控制器。

创建状态类

状态类必须始终继承自 StateController

// 状态类
class HomeState extends StateController {
  final String? name;

  const HomeState({
    super.status,
    this.name,
  });

  [@override](/user/override)
  HomeState copyWith({
    Status? status,
    String? name,
  }) {
    return HomeState(
      status: status ?? this.status,
      name: name ?? this.name,
    );
  }

  [@override](/user/override)
  List<Object?> get props => [status, name];
}

创建控制器

控制器必须继承自 Controller<HomeState>

// 控制器
class HomeController extends Controller<HomeState> {
  HomeController(super.value);

  [@override](/user/override)
  void onChange(HomeState? previous, HomeState current) {
    print('PREVIOUS ${previous?.name}');
    print('CURRENT ${current.name}');
  }

  setName(String name) {
    emit(value.copyWith(
      name: name,
      // status: Status.success,
    ));
  }

  setStatus([Status? status]) {
    emit(value.copyWith(status: status ?? Status.failure));
  }
}

注入依赖

在 widget 树的顶部使用 ControllerProvider 注入依赖。

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ControllerProvider(
      controllers: [
        HomeController(
          const HomeState(
            status: Status.loading,
            name: 'Lucas',
          ),
        ),
      ],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const MyHomePage(),
      ),
    );
  }
}

使用 ControllerBuilder

ControllerBuilder 是一个允许你以响应式方式构建用户界面的 widget。你可以通过传递你的控制器作为参数来使用它,或者如果不传递,则该 widget 将在 widget 树中使用 ControllerProvider 查找它。

该 widget 还会在满足 [buildWhen] 条件时调用 [builder],并返回 [builder] 的输出作为其子组件。如果 [buildWhen] 条件未满足,则返回 [builder] 的最后一个输出。

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    var controller = ControllerProvider.of<HomeController>(context);

    return Scaffold(
      appBar: AppBar(
        title: const Text('Home page'),
      ),
      body: ControllerBuilder<HomeController, HomeState>(
        buildWhen: (before, after) {
          return before.status != after.status;
        },
        builder: (BuildContext context, state) {
          if (state.status == Status.loading) {
            return const Center(child: CircularProgressIndicator());
          }

          return const Center(
            child: Text('Home completed loading'),
          );
        },
      ),
    );
  }
}

示例

以下是一个完整的示例,展示了如何使用 Eagle Provider

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ControllerProvider(
      controllers: [
        HomeController(
          const HomeState(
            status: Status.loading,
            name: 'Lucas',
          ),
        ),
      ],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: const MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    var controller = ControllerProvider.of<HomeController>(context);
    return Scaffold(
      appBar: AppBar(
        title: const Text(
          'Eagle Provider',
        ),
        actions: [
          ElevatedButton(
            onPressed: () {
              controller!.setName('Sabrina');
              // controller.setStatus(Status.loading);
            },
            child: const Text('change'),
          ),
        ],
      ),
      body: ControllerConsummer<HomeController, HomeState>(
        listener: (context, state) {
          print('LISTENER ${state.name}');
        },
        listenWhen: (previous, current) {
          return previous.name != current.name;
        },
        buildWhen: (previous, current) {
          return previous.status != current.status;
        },
        builder: (context, state) {
          return Center(
            child: Column(
              children: [
                Text(state.name.toString()),
                Text(state.status.toString()),
              ],
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // controller!.setName('Pryscilla');
          controller!.setStatus();
        },
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用eagle_provider插件的代码案例。eagle_provider是一个状态管理和依赖注入的插件,可以帮助你更方便地在Flutter应用中管理全局状态。

首先,确保你已经在pubspec.yaml文件中添加了eagle_provider的依赖:

dependencies:
  flutter:
    sdk: flutter
  eagle_provider: ^最新版本号  # 请替换为实际最新版本号

然后,运行flutter pub get来安装依赖。

1. 创建Provider

首先,我们创建一个简单的Provider类,这个类会包含一些状态数据以及用于更新这些数据的函数。

import 'package:eagle_provider/eagle_provider.dart';

class CounterProvider extends EagleProvider {
  int _count = 0;

  int getCount() {
    return _count;
  }

  void increment() {
    _count++;
    notifyListeners();  // 通知监听者状态已改变
  }
}

2. 配置EagleProvider

在你的应用入口文件(通常是main.dart)中,配置EagleProvider

import 'package:flutter/material.dart';
import 'package:eagle_provider/eagle_provider.dart';
import 'counter_provider.dart';  // 导入你创建的Provider

void main() {
  EagleProviderContainer.init(providers: [
    Provider<CounterProvider>.value(CounterProvider())
  ]);

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

3. 使用Provider中的数据

在你的组件中,使用EagleProvider.of<T>(context)来获取Provider实例,并访问其中的数据和方法。

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

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterProvider = EagleProvider.of<CounterProvider>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Eagle Provider Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counterProvider.getCount()}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterProvider.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

完整代码结构

  • pubspec.yaml:添加eagle_provider依赖。
  • counter_provider.dart:定义CounterProvider类。
  • main.dart:配置EagleProvider并运行应用。
  • home_screen.dart(或直接在main.dart中定义HomeScreen):使用CounterProvider来更新和显示计数。

以上就是一个完整的Flutter项目中使用eagle_provider插件的示例。通过这个示例,你可以看到如何在Flutter应用中使用eagle_provider来进行状态管理和依赖注入。

回到顶部