flutter开发核心 Future/stream/bloc

Future(异步操作)

  Future有三种状态未完成完成带有值完成带有异常,使用Future可以简化事件任务。Dart中,可以使用Future对象来表示异步操作的结果,Future返回类型是Future<T>

有三种方法处理Future的结果:

  • then: 处理操作执行结果或者错误并返回一个新的Future
  • catchError: 注册一个处理错误的回调
  • whenComplete:类似final,无论错误还是正确,Future执行结束后总是被调用

    使用then来回调,场景使用:UI需要接口的数据,一些异步执行函数

# demo1
main() {
  Future f1 = new Future(() {
    print("我是第一个");
  });
  f1.then((_) => print("f1 then"));
  print("我是main");
}
# print:
# 我是main
# 我是第一个
# f3 then

Future和async/await结合使用

   使用链式调用的方式把多个future连接在一起,会严重降低代码的可读性。使用async和await关键字实现异步的功能。async和await可以帮助我们像写同步代码一样编写异步代码

Future<String> getStr()async{
  var str = HttpRequest.getString('www.fgyong.cn');
  return str;
}

使用http请求地址www.fgyong.cn获取数据,然后返回。如何接收文本呢?

其实很简单,只需要使用await关键字即可,用来注册then回调。

main(List<String> args) async {
  String string = await getStr();
  print(string);
}

等同于

main(List<String> args) async {
  getStr().then((value) {
    print(value);
  });
}

stream—连续异步操作

如果Future表示单个计算的结果,则流是一系列结果

侦听流以获取有关结果(数据和错误

### FlutterBloc Pattern 的用法与示例 Bloc(Business Logic Component)模式是一种用于管理状态的设计模式,在 Flutter 和其他框架中被广泛采用。它通过分离业务逻辑和 UI 层来提高应用程序的可测试性和可维护性[^1]。 #### 什么是 BlocBloc 是一种基于流(Stream)的状态管理模式,允许开发者以响应式的方式处理应用中的数据变化。其核心理念是将输入事件映射到输出状态,从而驱动 UI 更新[^2]。 #### 主要组成部分 Bloc 模式的实现通常涉及以下几个部分: 1. **Event (事件)** 表示用户交互或其他触发器的动作,例如按钮点击或 API 响应到达。 2. **State (状态)** 描述当前的应用程序状态,UI 将根据这些状态的变化而更新。 3. **Bloc 类** 负责监听 Events 并将其转换为 States。这是整个模式的核心组件。 4. **Repository 或 Data Source** 提供数据源接口,可以是从本地数据库读取数据或者从网络请求获取数据。 --- #### 示例代码:计数器应用 下面是一个简单的计数器应用示例,展示如何使用 Bloc 来管理状态。 ##### 定义 Event 和 State ```dart // events.dart abstract class CounterEvent {} class IncrementCounter extends CounterEvent {} class DecrementCounter extends CounterEvent {} // states.dart abstract class CounterState { final int count; const CounterState(this.count); } class InitialCounterState extends CounterState { const InitialCounterState() : super(0); } ``` ##### 创建 Bloc 类 ```dart import 'dart:async'; import 'events.dart'; import 'states.dart'; class CounterBloc { // StreamController is used to manage the stream of data. final _counterStateController = StreamController<CounterState>(); get counterState => _counterStateController.stream; // Sink is where we add new events into the bloc. final _counterEventController = StreamController<CounterEvent>(); get counterEventSink => _counterEventController.sink; CounterBloc() { _counterEventController.stream.listen(_mapEventToState); } void _mapEventToState(CounterEvent event) { if (_counterStateController.isClosed) return; switch(event.runtimeType) { case IncrementCounter: var currentState = _counterStateController.hasValue ? _counterStateController.value : InitialCounterState(); _counterStateController.add(CounterState(currentState.count + 1)); break; case DecrementCounter: var currentState = _counterStateController.hasValue ? _counterStateController.value : InitialCounterState(); _counterStateController.add(CounterState(currentState.count - 1)); break; } } void dispose() { _counterStateController.close(); _counterEventController.close(); } } ``` ##### 使用 Bloc 构建 UI ```dart import 'package:flutter/material.dart'; import 'bloc/counter_bloc.dart'; import 'bloc/events.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: CounterPage(), ); } } class CounterPage extends StatefulWidget { @override _CounterPageState createState() => _CounterPageState(); } class _CounterPageState extends State<CounterPage> { late CounterBloc _bloc; @override void initState() { super.initState(); _bloc = CounterBloc(); } @override void dispose() { _bloc.dispose(); // Clean up resources when widget is disposed. super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Bloc Example')), body: Center( child: StreamBuilder<CounterState>( stream: _bloc.counterState, initialData: InitialCounterState(), builder: (context, snapshot) { return Text('${snapshot.data?.count}', style: TextStyle(fontSize: 48)); }, ), ), floatingActionButton: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ FloatingActionButton( onPressed: () => _bloc.counterEventSink.add(IncrementCounter()), tooltip: 'Increment', child: Icon(Icons.add), ), SizedBox(height: 10), FloatingActionButton( onPressed: () => _bloc.counterEventSink.add(DecrementCounter()), tooltip: 'Decrement', child: Icon(Icons.remove), ), ], ), ); } } ``` --- #### 测试与可维护性的关系 Bloc 设计的一个重要目标就是提升代码的可测试性和可维护性。由于所有的业务逻辑都集中在一个地方(即 Bloc),因此可以通过模拟不同的事件轻松编写单元测试案例。 ```dart test('Test increment functionality', () async { final bloc = CounterBloc(); expectLater(bloc.counterState, emitsInOrder([InitialCounterState(), CounterState(1)])); bloc.counterEventSink.add(IncrementCounter()); await Future.delayed(Duration(milliseconds: 50)); // Wait for state update. bloc.dispose(); }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值