Flutter通知构建插件notifier_builder的使用
Flutter通知构建插件notifier_builder的使用
一个Flutter库,它提供了比AnimatedBuilder更灵活的方式来构建依赖于任何可监听的通知器或控制器的小部件。
引言
NotifierBuilder
类是一个Flutter小部件,使你可以构建依赖于任何可监听的通知器或控制器的小部件。NotifierBuilder
类通过创建一个 notifier
并在 State
中持有它来工作。这是与 <a href="https://api.flutter.dev/flutter/widgets/AnimatedBuilder-class.html">AnimatedBuilder</a>
的关键区别。无论小部件重建多少次,控制器都只有一个实例。这意味着你可以在 StatelessWidget
中安全地使用带有 notifier
的控制器。你不需要像 Provider
这样的特殊库来为你持有控制器。
构建函数随后被调用,该函数基于通知器的状态构建小部件树。NotifierBuilder
设计用于与任何可监听的通知器一起工作,包括 ValueNotifier
、ChangeNotifier
和 StreamController
。
安装
要在你的Flutter项目中使用 NotifierBuilder
类,将以下依赖项添加到你的 pubspec.yaml
文件中:
dependencies:
notifier_builder: #VERSION
然后,在终端中运行 flutter pub get
。
使用
要使用 NotifierBuilder
类,创建一个新实例并传入通知器和构建函数。下面是一个示例:
import 'package:flutter/material.dart';
import 'package:notifier_builder/notifier_builder.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) => MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: NotifierBuilder<ValueNotifier<int>>(
notifier: () => ValueNotifier<int>(0),
builder: (context, child, notifier) => Scaffold(
body: Center(
child: Text(
notifier.value.toString(),
style: const TextStyle(fontSize: 24),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => notifier.value++,
child: const Icon(Icons.add),
),
),
),
);
}
在这个示例中,我们使用 ValueNotifier
作为通知器创建了一个新的 NotifierBuilder
实例。我们还传递了一个构建函数,该函数构建了一个 Scaffold
小部件,其中包含一个 Text
小部件,用于显示 ValueNotifier
的当前值,以及一个 FloatingActionButton
,当按下时会增加 ValueNotifier
的值。
除了处理实例化之外,构建函数还向小部件树公开了通知器。这在你需要从子小部件访问通知器时非常有用。例如,你可以使用通知器来访问子小部件中的当前值。
结论
使用此库代替 AnimatedBuilder
。该小部件不会多次实例化你的控制器,并且你可以通过 builder
函数访问控制器。
示例代码
import 'package:flutter/material.dart';
import 'package:notifier_builder/notifier_builder.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) => MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
class MyHomePage extends StatelessWidget {
const MyHomePage({
required this.title,
super.key,
});
final String title;
[@override](/user/override)
Widget build(BuildContext context) => NotifierBuilder(
notifier: () => ValueNotifier<int>(0),
builder: (context, child, counterNotifier) => Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'${counterNotifier.value}',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => counterNotifier.value++,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
),
);
}
更多关于Flutter通知构建插件notifier_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter通知构建插件notifier_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,notifier_builder
是一个在 Flutter 中用于状态管理的插件,它允许你根据某个通知(Notifier)的状态变化来重建特定的 UI 部分。以下是一个基本的代码示例,展示如何使用 notifier_builder
插件。
首先,确保你已经在 pubspec.yaml
文件中添加了 notifier_builder
依赖:
dependencies:
flutter:
sdk: flutter
notifier_builder: ^latest_version # 请使用最新版本号
然后,运行 flutter pub get
来获取依赖。
创建一个 Notifier 类
Notifier 类需要继承自 ChangeNotifier
。在这个例子中,我们创建一个简单的计数器 Notifier:
import 'package:flutter/material.dart';
class CounterNotifier extends ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // 通知监听器状态已改变
}
}
使用 NotifierBuilder 构建 UI
接下来,在你的 Flutter 应用中使用 NotifierProvider
和 NotifierBuilder
来管理状态和构建 UI:
import 'package:flutter/material.dart';
import 'package:notifier_builder/notifier_builder.dart';
import 'counter_notifier.dart'; // 假设你将 Notifier 类放在这个文件里
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'NotifierBuilder Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => CounterNotifier()),
],
child: Scaffold(
appBar: AppBar(
title: Text('NotifierBuilder Demo'),
),
body: Center(
child: NotifierBuilder<CounterNotifier>(
notifier: (context) => context.read<CounterNotifier>(),
builder: (context, notifier, child) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${notifier.count}',
style: Theme.of(context).textTheme.headline4,
),
],
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
final notifier = context.read<CounterNotifier>();
notifier.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
),
);
}
}
解释代码
-
Notifier 类:
CounterNotifier
继承自ChangeNotifier
,包含一个可观察的计数器_count
和一个increment
方法来增加计数并通知监听器。 -
MultiProvider:在应用的顶层使用
MultiProvider
来提供CounterNotifier
。ChangeNotifierProvider
创建并管理CounterNotifier
的实例。 -
NotifierBuilder:使用
NotifierBuilder
小部件来监听CounterNotifier
的状态变化。当CounterNotifier
调用notifyListeners()
时,NotifierBuilder
会重新构建其builder
函数返回的 UI。 -
FloatingActionButton:一个浮动操作按钮,当点击时调用
CounterNotifier
的increment
方法来增加计数。
通过这种方式,你可以轻松地在 Flutter 应用中使用 notifier_builder
插件来管理状态和响应状态变化。