Flutter功能扩展插件eagle_provider的使用
Flutter功能扩展插件eagle_provider的使用
Eagle Provider
是一个简单的状态管理包,它仅使用 ValueNotifier
和 InheritedWidget
。
使用
要使用它,只需创建一个状态类和另一个作为状态控制器。
创建状态类
状态类必须始终继承自 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
更多关于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
来进行状态管理和依赖注入。