Flutter数据监听与构建插件watcher_builder的使用

Flutter数据监听与构建插件watcher_builder的使用

NEW!

随着版本1.1.0的发布,你现在可以使用.watch方法创建任何类型的VarWatcher实例,这将使你更容易监控变量。此外,版本1.1.0还简化了构建器的方法。例如,你可以调用watcher上的.build()方法,并传入构建器函数。

final watcher = 0.watch;
// 这将在watcher上调用notify时自动重新构建
Widget watcherBuilder = watcher.build((value) => Text('value = $value'));

我们进一步简化了构建器,通过在VarWatcher上引入一个新的操作符。

Widget simple = watcher >> (value) => Text('value = $value');

同样地,如果你声明一个VarWatcher列表,也可以调用相同的方法和操作符。

final watchers = [
  0.watch,
  0.watch,
  0.watch,
];
Widget watchersBuilder = watchers.build(
  () => Column(children: watchersBuilder.map((w) => 
    Text('value = ${w.value}')).toList())
);
// 或者
Widget simple2 = watchers >> Column(children: watchersBuilder.map((w) => 
  Text('value = ${w.value}')).toList());

特性

WatcherBuilder是Flutter中最简单的状态管理方式。你所要做的就是声明一个VarWatcher,在WatcherBuilder内部使用它,并在需要更新/重新构建其小部件时调用notify

使用方法

[@override](/user/override)  
Widget build(BuildContext context) {  
  final counter = VarWatcher(0);  
  return Scaffold(  
    body: Center(  
      child: Column(  
        mainAxisAlignment: MainAxisAlignment.center,  
        children: [  
          WatcherBuilder(  
            watch: counter,  
            builder: (context, value) => Text('Counter = $value'),  
          ),  
          OutlinedButton(  
            onPressed: () {  
              counter.value++;  
              counter.notify();  
            },  
            child: const Text('Increment'),  
          )  
        ],  
      ),  
    ),  
  );  
}

额外信息

你还可以使用WatchersBuilder来监控多个VarWatchers

示例代码

以下是example/main.dart文件中的完整示例:

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

void main() {
  runApp(const MaterialApp(
    home: Example(),
  ));
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    final counter = 0.watch;
    final counters = [
      0.watch,
      0.watch,
      0.watch,
    ];
    return Scaffold(
      body: SizedBox(
        width: MediaQuery.sizeOf(context).width,
        child: Center(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  // 示例1:基本的WatcherBuilder
                  WatcherBuilder(
                    watch: counter,
                    builder: (context, value) => Text('Counter = $value'),
                  ),
                  // 示例2:从变量中获取简单的构建器函数
                  counter.build((value) => Text('Counter = $value')),
                  // 示例3:更简单的构建器操作符
                  counter >> (value) => Text('Counter = $value'),
                  OutlinedButton(
                    onPressed: () {
                      counter.value++;
                      counter.notify();
                    },
                    child: const Text('Increment'),
                  )
                ],
              ),
              const SizedBox(width: 100),
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  // 示例1:基本的WatcherBuilder
                  WatchersBuilder(
                    watchers: counters,
                    builder: (context) {
                      return Column(
                        children: counters
                            .map((w) => Text('Counter = ${w.value}'))
                            .toList(),
                      );
                    },
                  ),
                  // 示例2:从变量中获取简单的构建器函数
                  counters.build(() {
                    return Column(
                      children: counters
                          .map((w) => Text('Counter = ${w.value}'))
                          .toList(),
                    );
                  }),
                  // 示例3:更简单的构建器操作符
                  counters >> 
                      () {
                        return Column(
                          children: counters
                              .map((w) => Text('Counter = ${w.value}'))
                              .toList(),
                        );
                      },
                  OutlinedButton(
                    onPressed: () {
                      for (var c in counters) {
                        c.value += 1 + counters.indexOf(c);
                      }
                    },
                    child: const Text('Increment'),
                  )
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter数据监听与构建插件watcher_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据监听与构建插件watcher_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用watcher_builder包进行数据监听与构建的示例代码。watcher_builder是一个用于监听数据变化并重建UI的Flutter插件。不过需要注意的是,watcher_builder并不是Flutter官方提供的包,而是一个社区维护的包,因此确保你已经在pubspec.yaml文件中添加了这个依赖。

首先,确保在pubspec.yaml中添加依赖:

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

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

接下来是一个完整的示例代码,展示如何使用watcher_builder来监听数据变化并更新UI:

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Watcher Builder Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 创建一个可监听的数据对象
  final _counter = ValueNotifier<int>(0);

  void _incrementCounter() {
    _counter.value++;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Watcher Builder Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用WatcherBuilder监听_counter的变化
            WatcherBuilder<int>(
              watch: () => _counter.value,
              builder: (context, value, child) {
                return Text(
                  'You have pushed the button this many times:',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
              childBuilder: (context, value) {
                return Text(
                  '$value',
                  style: Theme.of(context).textTheme.headline4,
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }

  @override
  void dispose() {
    // 释放资源
    _counter.dispose();
    super.dispose();
  }
}

在这个示例中,我们使用了ValueNotifier来创建一个可监听的数据对象_counter。然后,我们使用WatcherBuilder来监听这个数据对象的变化。当_counter的值发生变化时,WatcherBuilder会自动调用childBuilder来重建UI。

WatcherBuilder接收两个主要参数:

  • watch:一个返回监听值的函数。
  • childBuilder:一个根据监听值构建子组件的函数。

此外,还有一个可选的builder参数,它允许你基于监听值构建一个不依赖于子组件的静态部分。在这个例子中,我们使用builder来显示一个静态文本,而使用childBuilder来显示动态变化的计数器值。

请注意,由于watcher_builder可能不是官方包,其API和用法可能会有所不同,因此请参考其官方文档以获取最新和最准确的信息。如果watcher_builder包不存在或已过时,可以考虑使用Flutter内置的ProviderRiverpodGetX等状态管理库来实现类似的功能。

回到顶部