Flutter状态管理插件provider12的使用
Flutter状态管理插件provider12的使用
引言
本文将详细介绍如何在Flutter应用中使用状态管理插件provider12
。我们将通过一个完整的示例来展示如何配置和使用provider
来管理状态。
简介
provider
是一个用于简化状态管理的库,它通过包装InheritedWidget
来实现。使用provider
可以简化资源分配和清理、懒加载、减少样板代码,并且可以更好地与开发工具集成。
示例代码
我们首先来看一个简单的示例,该示例展示了如何使用provider
来管理一个计数器的状态。
项目结构
example/
├── lib/
│ ├── main.dart
main.dart
文件
// ignore_for_file: public_member_api_docs, lines_longer_than_80_chars
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider12/provider.dart';
/// 这是一个使用provider + [ChangeNotifier]重新实现的默认Flutter应用程序。
void main() {
runApp(
/// 提供者位于[MyApp]之上,而不是其中,这样测试可以使用[MyApp]并模拟提供者
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => Counter()),
],
child: const MyApp(),
),
);
}
/// 混入[DiagnosticableTreeMixin]以在devtools中读取其所有属性
// ignore: prefer_mixin
class Counter with ChangeNotifier, DiagnosticableTreeMixin {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners();
}
/// 使`Counter`在devtools中可读,列出所有属性
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties.add(IntProperty('count', count));
}
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('示例'),
),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('你已经按了按钮次数:'),
/// 作为单独的部件提取出来以进行性能优化。
/// 作为一个单独的部件,它将独立于[MyHomePage]重建。
Count(),
],
),
),
floatingActionButton: FloatingActionButton(
key: const Key('increment_floatingActionButton'),
/// 调用`context.read`而不是`context.watch`,以便当[Counter]更改时不重建
onPressed: () => context.read<Counter>().increment(),
tooltip: '增加',
child: const Icon(Icons.add),
),
);
}
}
class Count extends StatelessWidget {
const Count({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Text(
/// 调用`context.watch`以使[Count]在[Counter]更改时重建
'${context.watch<Counter>().count}',
key: const Key('counterState'),
style: Theme.of(context).textTheme.headlineMedium,
);
}
}
详细说明
-
创建计数器类:
class Counter with ChangeNotifier, DiagnosticableTreeMixin { int _count = 0; int get count => _count; void increment() { _count++; notifyListeners(); } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties.add(IntProperty('count', count)); } }
-
在
main
函数中配置MultiProvider
:void main() { runApp( MultiProvider( providers: [ ChangeNotifierProvider(create: (_) => Counter()), ], child: const MyApp(), ), ); }
-
使用
Context
读取状态:class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Column( children: const [ Text('你已经按了按钮次数:'), Count(), ], ), ), floatingActionButton: FloatingActionButton( onPressed: () => context.read<Counter>().increment(), tooltip: '增加', child: const Icon(Icons.add), ), ); } } class Count extends StatelessWidget { @override Widget build(BuildContext context) { return Text( '${context.watch<Counter>().count}', style: Theme.of(context).textTheme.headlineMedium, ); } }
更多关于Flutter状态管理插件provider12的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件provider12的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,Provider
是一个非常流行的状态管理插件,它可以帮助你轻松地管理和传递应用的状态。Provider
是基于 InheritedWidget
的封装,提供了更简洁和灵活的方式来管理状态。
以下是使用 Provider
12.x 版本的基本步骤和示例:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 provider
依赖:
dependencies:
flutter:
sdk: flutter
provider: ^6.0.0
然后运行 flutter pub get
来安装依赖。
2. 创建 Model
Provider
需要一个 ChangeNotifier
类来管理状态。你可以创建一个继承自 ChangeNotifier
的类,并在其中定义你的状态和业务逻辑。
import 'package:flutter/material.dart';
class CounterModel with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // 通知监听者状态已更新
}
}
3. 在应用中提供 Model
使用 ChangeNotifierProvider
将 CounterModel
提供给整个应用或某个子树。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_model.dart';
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => CounterModel(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Provider Example',
home: HomeScreen(),
);
}
}
4. 在 UI 中使用 Model
在 HomeScreen
中,你可以使用 Provider.of
或 Consumer
来访问 CounterModel
并更新 UI。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter_model.dart';
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Provider Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Consumer<CounterModel>(
builder: (context, counter, child) {
return Text(
'${counter.count}',
style: Theme.of(context).textTheme.headline4,
);
},
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Provider.of<CounterModel>(context, listen: false).increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
5. 运行应用
现在你可以运行应用,点击浮动按钮来增加计数器,UI 会自动更新。
6. 其他 Provider 类型
Provider
提供了多种不同类型的 Provider
来满足不同的需求:
Provider
: 提供不可变的状态。ChangeNotifierProvider
: 提供ChangeNotifier
对象。ListenableProvider
: 提供Listenable
对象。ValueListenableProvider
: 提供ValueListenable
对象。StreamProvider
: 提供Stream
对象。FutureProvider
: 提供Future
对象。
你可以根据具体需求选择合适的 Provider
类型。
7. 多层 Provider
如果你的应用有多个状态需要管理,可以使用多层 Provider
:
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CounterModel()),
Provider(create: (_) => SomeOtherModel()),
],
child: MyApp(),
),
);
}