首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >颤振BLoc孔型参数

颤振BLoc孔型参数
EN

Stack Overflow用户
提问于 2020-06-01 02:07:16
回答 3查看 7.2K关注 0票数 1

我试图将参数传递给一个遵循集团模式的事件,但是我发现本文中的dart文档找不到dispatch (事件)方法。

Flutter BLoC - How to pass parameter to event?

如何将参数传递给这样的东西

main.dart

这行得通

代码语言:javascript
复制
_counterBloc.add(Counter.increment); 

但这不是

代码语言:javascript
复制
_counterBloc.add(Counter.increment(3));

bloc.dart

代码语言:javascript
复制
import 'package:bloc/bloc.dart';

enum CounterEvents { increment }

class CounterBloc extends Bloc<CounterEvents, int> {
  @override
  int get initialState => 0;

  @override
  Stream<int> mapEventToState(CounterEvents event) async* {
    switch (event) {
      case CounterEvents.increment:
        print(event);
        yield state + 1;
        break;
    }
  }
}
EN

回答 3

Stack Overflow用户

发布于 2020-06-24 12:20:06

应该编写如下所示的CounterEvent:

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

enum EventStatus { INCREMENT, DECREMENT }

class CounterEvent {
  final int value;
  final EventStatus status;

  const CounterEvent({@required this.value, @required this.status});
}

class CounterBLoC extends Bloc<CounterEvent, int> {
  @override
  int get initialState => 0;

  @override
  Stream<int> mapEventToState(event) async* {
    if (event.status == EventStatus.INCREMENT) {
      yield state + event.value;
    } else if (event.status == EventStatus.DECREMENT) {
      yield state - event.value;
    }
  }
}

并在小部件中使用它们,如下所示:

代码语言:javascript
复制
@override
  Widget build(BuildContext context) {
    final counterBloc = BlocProvider.of<CounterBLoC>(context);
    return Scaffold(
      body: Center(
        child: BlocBuilder<CounterBLoC, int>(
          builder: (ctx, state) {
            return Text(
              'count: $state',
              style: TextStyle(fontSize: 28),
            );
          },
        ),
      ),
      floatingActionButton: Align(
        alignment: Alignment.bottomRight,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            FloatingActionButton(
              onPressed: () {
                counterBloc
                    .add(CounterEvent(value: 5, status: EventStatus.INCREMENT));
              },
              child: Icon(Icons.add_circle),
            ),
            FloatingActionButton(
              onPressed: () {
                counterBloc
                    .add(CounterEvent(value: 5, status: EventStatus.DECREMENT));
              },
              child: Icon(Icons.remove_circle),
            ),
          ],
        ),
      ),
    );
  }

确保在总体上加入你的集团:

代码语言:javascript
复制
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BlocProvider<CounterBLoC>(
        create: (ctx) => CounterBLoC(),
        child: TestBlocWidget(),
      ),
    );
  }
}
票数 8
EN

Stack Overflow用户

发布于 2020-06-09 05:59:58

如果您正试图使用集团模式重新构建计数器应用程序,请阅读本文,这可能会有所帮助。

https://bloclibrary.dev/#/fluttercountertutorial?id=counter-app

票数 0
EN

Stack Overflow用户

发布于 2021-04-02 16:04:07

考虑创建一个自定义事件。您的解决方案应该是这样的(尚未检查but,但范例是正确的):

代码语言:javascript
复制
abstract class CounterEvent {}

class Increment extends CounterEvent {
    int amount;
    Increment({this.amount});
}

那么在你的阵营里:

代码语言:javascript
复制
class CounterBloc extends Bloc<CounterEvent, int> {
  @override
  int get initialState => 0;

  @override
  Stream<int> mapEventToState(CounterEvent event) async* {
    if (event is Increment) {
       yield state + event.amount;
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62124731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档