Flutter通知构建插件notifier_builder的使用

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

Flutter通知构建插件notifier_builder的使用

build_and_test

codecov

一个Flutter库,它提供了比AnimatedBuilder更灵活的方式来构建依赖于任何可监听的通知器或控制器的小部件。

引言

NotifierBuilder 类是一个Flutter小部件,使你可以构建依赖于任何可监听的通知器或控制器的小部件。NotifierBuilder 类通过创建一个 notifier 并在 State 中持有它来工作。这是与 <a href="https://api.flutter.dev/flutter/widgets/AnimatedBuilder-class.html">AnimatedBuilder</a> 的关键区别。无论小部件重建多少次,控制器都只有一个实例。这意味着你可以在 StatelessWidget 中安全地使用带有 notifier 的控制器。你不需要像 Provider 这样的特殊库来为你持有控制器。

构建函数随后被调用,该函数基于通知器的状态构建小部件树。NotifierBuilder 设计用于与任何可监听的通知器一起工作,包括 ValueNotifierChangeNotifierStreamController

安装

要在你的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

1 回复

更多关于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 应用中使用 NotifierProviderNotifierBuilder 来管理状态和构建 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),
        ),
      ),
    );
  }
}

解释代码

  1. Notifier 类CounterNotifier 继承自 ChangeNotifier,包含一个可观察的计数器 _count 和一个 increment 方法来增加计数并通知监听器。

  2. MultiProvider:在应用的顶层使用 MultiProvider 来提供 CounterNotifierChangeNotifierProvider 创建并管理 CounterNotifier 的实例。

  3. NotifierBuilder:使用 NotifierBuilder 小部件来监听 CounterNotifier 的状态变化。当 CounterNotifier 调用 notifyListeners() 时,NotifierBuilder 会重新构建其 builder 函数返回的 UI。

  4. FloatingActionButton:一个浮动操作按钮,当点击时调用 CounterNotifierincrement 方法来增加计数。

通过这种方式,你可以轻松地在 Flutter 应用中使用 notifier_builder 插件来管理状态和响应状态变化。

回到顶部