Flutter StreamBuilder 的用法

Flutter StreamBuilder 的用法 异步流操作

/// Flutter code sample for StreamBuilder

// This sample shows a [StreamBuilder] that listens to a Stream that emits bids
// for an auction. Every time the StreamBuilder receives a bid from the Stream,
// it will display the price of the bid below an icon. If the Stream emits an
// error, the error is displayed below an error icon. When the Stream finishes
// emitting bids, the final price is displayed.

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

/// This is the main application widget.
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: _title,
      home: MyStatefulWidget(),
    );
  }
}

/// This is the stateful widget that the main application instantiates.
class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({Key? key}) : super(key: key);

  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

/// This is the private State class that goes with MyStatefulWidget.
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  final Stream<int> _bids = (() async* {
    await Future<void>.delayed(const Duration(seconds: 1));
    yield 1;
    await Future<void>.delayed(const Duration(seconds: 1));
  })();

  @override
  Widget build(BuildContext context) {
    return DefaultTextStyle(
      style: Theme.of(context).textTheme.headline2!,
      textAlign: TextAlign.center,
      child: Container(
        alignment: FractionalOffset.center,
        color: Colors.white,
        child: StreamBuilder<int>(
          stream: _bids,
          builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
            List<Widget> children;
            if (snapshot.hasError) {
              children = <Widget>[
                const Icon(
                  Icons.error_outline,
                  color: Colors.red,
                  size: 60,
                ),
                Padding(
                  padding: const EdgeInsets.only(top: 16),
                  child: Text('Error: ${snapshot.error}'),
                ),
                Padding(
                  padding: const EdgeInsets.only(top: 8),
                  child: Text('Stack trace: ${snapshot.stackTrace}'),
                ),
              ];
            } else {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  children = const <Widget>[
                    Icon(
                      Icons.info,
                      color: Colors.blue,
                      size: 60,
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 16),
                      child: Text('Select a lot'),
                    )
                  ];
                  break;
                case ConnectionState.waiting:
                  children = const <Widget>[
                    SizedBox(
                      child: CircularProgressIndicator(),
                      width: 60,
                      height: 60,
                    ),
                    Padding(
                      padding: EdgeInsets.only(top: 16),
                      child: Text('Awaiting bids...'),
                    )
                  ];
                  break;
                case ConnectionState.active:
                  children = <Widget>[
                    const Icon(
                      Icons.check_circle_outline,
                      color: Colors.green,
                      size: 60,
                    ),
                    Padding(
                      padding: const EdgeInsets.only(top: 16),
                      child: Text('\$${snapshot.data}'),
                    )
                  ];
                  break;
                case ConnectionState.done:
                  children = <Widget>[
                    const Icon(
                      Icons.info,
                      color: Colors.blue,
                      size: 60,
                    ),
                    Padding(
                      padding: const EdgeInsets.only(top: 16),
                      child: Text('\$${snapshot.data} (closed)'),
                    )
                  ];
                  break;
              }
            }

            return Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: children,
            );
          },
        ),
      ),
    );
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flutter中,局部刷新可以通过以下两种方式实现: 1. **使用Provider**[^1] Provider是Flutter的一个状态管理库,它允许你将状态分发到应用程序的各个部分。当你需要更新特定部分的UI时,只需调用`Consumer` widget并提供一个变更通知的方法,如`notifyListeners()`,这将会使得仅依赖该状态的组件重新构建。 ```dart import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; // 创建一个Provider并提供一个变更方法 class MyProvider with ChangeNotifier { // 假设这是你的状态 int count = 0; void increment() { count++; notifyListeners(); } } // 在Consumer中监听并响应变更 class LocalRefreshWithProvider extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer<MyProvider>( builder: (context, provider, child) { return Text('Count: ${provider.count}'); // 当count变化时,这里会自动更新 }, ); } } ``` 2. **使用StreamBuilder** StreamBuilder监听流(stream)的变化,当流中的数据有新的更新时,会自动触发组件的重建,从而实现局部刷新。这对于实时数据更新非常有用,比如网络请求返回的数据。 ```dart class LocalRefreshWithStreamBuilder extends StatelessWidget { final StreamController<int> controller = StreamController<int>.broadcast(); @override Widget build(BuildContext context) { return StreamBuilder<int>( stream: controller.stream, builder: (context, snapshot) { if (snapshot.hasData) { return Text('Count: $snapshot.data'); } else { return CircularProgressIndicator(); } }, // 更新数据时调用此方法 onChanged: (value) { controller.add(value); }, ); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

computerclass

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值