Flutter数据流管理插件streams_provider的使用

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

Flutter数据流管理插件streams_provider的使用

Coverage GitHub issues GitHub stars GitHub license


它提供了一种优雅且有效的方式来在Provider中使用流。

Streams Widgets

StreamsProvider 是一个Flutter小部件,通过Provider.of<T>(context)为它的子组件提供一个provider。它被用作依赖注入(DI)小部件,因此可以在子树中的多个小部件中提供单个provider实例。

在大多数情况下,应该使用StreamsProvider来创建一个新的provider,该provider将对子树的其余部分可用。在这种情况下,由于StreamsProvider负责创建provider,它会自动处理关闭provider的操作。

StreamsProvider(
  create: (BuildContext context) => CounterProvider(),
  child: CounterPage(),
);

在某些情况下,StreamsProvider可以用来为新的widget树部分提供现有的provider。这种情况最常见于当现有的provider需要在新路由中可用时。在这种情况下,StreamsProvider不会自动关闭provider,因为它不是创建者。

StreamsProvider.value(
  value: StreamsProvider.of<CounterProvider>(context),
  child: SomeOtherPage(),
);

然后从CounterPageSomeOtherPage中,我们可以使用以下方式获取CounterProvider

// 使用扩展方法
context.provider<CounterProvider>();

// 不使用扩展方法
StreamsProvider.of<CounterProvider>(context)

StreamsSelector 是一个Flutter小部件,它从provider中选择流,并在选择器流发出信号时调用构建器。

StreamsSelector<CounterProvider, int>(
  selector: (context, provider) {
     // 从CounterProvider中选择流
     return provider.counter;
  },
  builder: (context, count, child) {
    // 返回基于选择器流发出信号的小部件
    return Center(
      child: Text(
        '$count',
        style: TextStyle(fontSize: 24.0),
      ),
    );
  },
)

StreamsListener 是一个Flutter小部件,它接受一个StreamsWidgetListener和一个选择器,并在选择器的信号发出时调用监听器。它用于需要在每次信号发出时执行的功能,例如导航、显示SnackBar、显示Dialog等…监听器仅在每次信号发出时调用一次。

StreamsListener<CounterProvider, int>(
  selector: (context, provider) {
     // 从CounterProvider中选择流
     return provider.counter;
  },
  listener: (context, count) {
    // 基于数据更改执行操作
    if (count == 10) {
      // 显示SnackBar或其他功能
    }
  },
  child: Container(),
)

Usage

让我们看看如何使用StreamsSelector将一个CounterPage小部件与CounterProvider连接起来。

counter_provider.dart

class CounterProvider implements StreamsProvidable {
  final _counter = MutableValueStream<int>(0);
  ValueStream<int> counter => _counter;

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

  void decrementCounter() {
    _counter.value--;
  }
}

counter_page.dart

class CounterPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final CounterProvider counterProvider = context.provider<CounterProvider>();

    return Scaffold(
      appBar: AppBar(title: Text('Counter')),
      body: StreamsSelector<CounterProvider, int>(
        selector: (context, provider) => provider.counter,
        builder: (context, count, child) {
          return Center(
            child: Text(
              '$count',
              style: TextStyle(fontSize: 24.0),
            ),
          );
        },
      ),
      floatingActionButton: Column(
        crossAxisAlignment: CrossAxisAlignment.end,
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          Padding(
            padding: EdgeInsets.symmetric(vertical: 5.0),
            child: FloatingActionButton(
              child: Icon(Icons.add),
              onPressed: () {
                counterProvider.incrementCounter();
              },
            ),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 5.0),
            child: FloatingActionButton(
              child: Icon(Icons.remove),
              onPressed: () {
                counterProvider.decrementCounter();
              },
            ),
          ),
        ],
      ),
    );
  }
}

更多关于Flutter数据流管理插件streams_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据流管理插件streams_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,streams_provider 是一个用于在 Flutter 应用中管理数据流的插件。它允许你创建和管理数据流,并在整个应用中轻松访问这些数据。以下是一个简单的示例,展示如何使用 streams_provider 来管理数据流。

首先,确保你已经在你的 pubspec.yaml 文件中添加了 streams_provider 依赖:

dependencies:
  flutter:
    sdk: flutter
  streams_provider: ^x.y.z  # 请使用最新版本号

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

1. 创建数据流

假设我们有一个简单的计数器数据流。首先,我们需要创建一个 CounterStream 类来管理这个数据流。

// counter_stream.dart
import 'package:streams_provider/streams_provider.dart';

class CounterStream extends StateStream<int> {
  CounterStream() : super(0);

  void increment() {
    updateState((currentState) => currentState + 1);
  }

  void decrement() {
    updateState((currentState) => currentState - 1);
  }
}

2. 提供数据流

接下来,我们需要使用 StreamProvider 来提供这个数据流。

// main.dart
import 'package:flutter/material.dart';
import 'package:streams_provider/streams_provider.dart';
import 'counter_stream.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StreamProvider<CounterStream>.value(
      value: CounterStream(),
      child: MaterialApp(
        home: CounterScreen(),
      ),
    );
  }
}

3. 使用数据流

现在,我们可以在 CounterScreen 中使用这个数据流。

// counter_screen.dart
import 'package:flutter/material.dart';
import 'package:streams_provider/streams_provider.dart';

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counterStream = StreamProvider.of<CounterStream>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Counter Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            StreamBuilder<int>(
              stream: counterStream.state,
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.active) {
                  final count = snapshot.data ?? 0;
                  return Text(
                    '$count',
                    style: Theme.of(context).textTheme.headline4,
                  );
                } else {
                  return Text('Loading...');
                }
              },
            ),
          ],
        ),
      ),
      floatingActionButton: Column(
        mainAxisAlignment: MainAxisAlignment.end,
        children: <Widget>[
          FloatingActionButton(
            onPressed: () {
              context.read<CounterStream>().increment();
            },
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
          FloatingActionButton(
            onPressed: () {
              context.read<CounterStream>().decrement();
            },
            tooltip: 'Decrement',
            child: Icon(Icons.remove),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们创建了一个 CounterStream 类来管理计数器的状态。我们使用 StreamProvider.valueMyApp 中提供了这个数据流。然后,在 CounterScreen 中,我们使用 StreamProvider.of 来访问这个数据流,并使用 StreamBuilder 来监听和显示计数器的当前值。同时,我们还添加了两个 FloatingActionButton,分别用于增加和减少计数器的值。

这样,你就成功地使用 streams_provider 插件在 Flutter 应用中管理数据流了。

回到顶部