标签: bloc

Flutter:如何模拟 Bloc

我想模拟我的集团以测试我的观点。

例如,这是我的 Bloc:

class SearchBloc extends Bloc<SearchEvent, SearchState> {
  @override
  // TODO: implement initialState
  SearchState get initialState => SearchStateUninitialized();

  @override
  Stream<SearchState> mapEventToState(SearchState currentState, SearchEvent event) async* {
    if (event is UserWrites) {
      yield (SearchStateInitialized.success(objects);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是观点:

class _SearchViewState extends State<SearchView> {
  final TextEditingController _filterController = new TextEditingController();

  @override
  void initState() {
    _filterController.addListener(() {
    widget._searchBloc.dispatch(FetchByName(_filterController.text));
     }
  }


 TextField buildAppBarTitle(BuildContext context) {
    return new TextField(
      key: Key("AppBarTextField"),
        controller: _filterController,
    );
  }

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: …
Run Code Online (Sandbox Code Playgroud)

testing mocking flutter bloc

9
推荐指数
1
解决办法
3763
查看次数

使用 bloc 框架时如何为文本字段提供默认值

我编写了一些简单的 flutter 应用程序,它们使用有状态的小部件/表单/文本表单字段来输入和管理数据。现在我正在尝试了解如何使用 BLoC 和流构建器来完成类似的工作。但是我不知道如何为我的字段设置初始值。

我试图创建一个最简单的例子,我可以想出一个使用 bloc 的小应用程序。这只是需要一个输入到 TextField 的名称并将其回显到下一行。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Bloc Example',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage();

  String initialData = 'Fred';

  @override
  Widget build(BuildContext context) {

    TextEditingController _controller = new TextEditingController();

    return Scaffold(
      appBar: AppBar(title: Text('Bloc Example')),
      body: Center(
        child: Column(
          children: <Widget>[
          StreamBuilder(
            initialData: initialData,
            stream: bloc.nameStream,
              builder: (context, snapshot) {
                if …
Run Code Online (Sandbox Code Playgroud)

dart flutter bloc

9
推荐指数
1
解决办法
7439
查看次数

Flutter BLOC 和 Provider 如何注册在一起

我正在使用 BLOC 架构编写一个应用程序,并在 main.dart 中注册像这样的块提供程序:

runApp(MultiBlocProvider(providers: [
    BlocProvider<OrderBloc>(
      create: (context) {
        return OrderBloc()..add(OrderInitialEvent());
      },
    ),
    BlocProvider<AuthenticationBloc>(
      create: (context) {
        return AuthenticationBloc(userService: userService)..add(AppStarted());
      },
    ),
    ...
   ], child: MyApp()));
Run Code Online (Sandbox Code Playgroud)

现在我需要将 Provider 方法与 BLOC 一起使用,但不知道如何注册它?是否可以?谢谢

provider flutter bloc

9
推荐指数
1
解决办法
2891
查看次数

Flutter Application Bloc 侦听器未接收状态更新

我使用 flutter Bloc 将用户导航到登录页面或主屏幕,具体取决于用户是否经过身份验证。但是,在初始状态更改后,当我更改身份验证状态时,侦听器不会触发。

听众:

Widget build(BuildContext context) {
  return BlocListener<AuthenticationBloc, AuthenticationState>(
    listener: (context, state) {
      // Listener never gets called on statechange after the initial app startup

      // navigation based on authentication 
      }
    },
    child: SplashPage(),
  );
}
Run Code Online (Sandbox Code Playgroud)

提供者在父小部件中初始化:

AuthenticationRepository authRepo = AuthenticationRepository();

Widget build(BuildContext context) {
  return MultiBlocProvider(
    providers: [
      BlocProvider<AuthenticationBloc>(
        create: (BuildContext context) =>
            AuthenticationBloc(authenticationRepository: authRepo),
      ),
      /*
         Other Providers
      */
    ],
    child: MaterialApp(
      title: 'myApp',
      home: StartUpPage(),
    ),
  );
Run Code Online (Sandbox Code Playgroud)

当用户登录时,mapEventState 在 AuthenticationBloc 中被调用:

class AuthenticationBloc
    extends …
Run Code Online (Sandbox Code Playgroud)

dart flutter bloc flutter-bloc

9
推荐指数
1
解决办法
5771
查看次数

Bloc 观察者不显示日志

嘿,我一直将块观察者作为我的 flutter 应用程序中的主要状态管理工具,并且使用它使事情变得更加容易。块观察者是我用来调试和观察发生的事情的主要工具。但迁移到 Bloc v8.0.0 后,bloc 观察者已停止记录。

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  HttpOverrides.global = MyHttpOverrides();
  await Hive.initFlutter();
  Hive.registerAdapter(UserAdapter());
  await Hive.openBox<User>('user');
  await Firebase.initializeApp();
  BlocOverrides.runZoned(
    () {},
    blocObserver: SimpleBlocObserver(),
  );
   ...
}
Run Code Online (Sandbox Code Playgroud)

这是主要功能的片段

Bloc observer

import 'package:flutter_bloc/flutter_bloc.dart';

class SimpleBlocObserver extends BlocObserver {
  @override
  void onEvent(Bloc bloc, Object? event) {
    super.onEvent(bloc, event);
    print(event);
  }

  @override
  void onChange(BlocBase bloc, Change change) {
    super.onChange(bloc, change);
    print(change);
  }

  @override
  void onCreate(BlocBase bloc) {
    super.onCreate(bloc);
    print(bloc);
  }

  @override
  void onTransition(Bloc bloc, Transition transition) {
    super.onTransition(bloc, transition);
    print(transition); …
Run Code Online (Sandbox Code Playgroud)

android dart flutter bloc

9
推荐指数
2
解决办法
9137
查看次数

如何在 flutter 上使用 go_router 将块传递到另一个屏幕

在 Flutter 上,我想将本地传递bloc到另一个屏幕。这就是我在使用默认导航器时将块传递到新路线的方式。

Navigator.of(context).push(
      MaterialPageRoute<void>(
        builder: (BuildContext context) =>  BlocProvider.value(
          value: localBloc,
          child: MyPage(),
      ),
    ));
Run Code Online (Sandbox Code Playgroud)

但现在,我正在使用该go_router包进行导航。我怎样才能将本地提供bloc给我想要使用的屏幕BlocProvider.value()

dart flutter bloc flutter-bloc flutter-go-router

9
推荐指数
2
解决办法
3816
查看次数

嵌套 StreamBuilder 是好模式吗?

我正在使用 Bloc Pattern 和 Streams 从 HackerNews API 获取文章。

我正在加载所有文章并在流构建器的帮助下在 UI 中呈现,这工作正常。

现在我用新的加载 StreamBuilder 包装了获取 Stream builder 的文章。现在,当加载流构建器为真(意味着它正在加载)时,它会显示一个循环进度指示器,否则,它会显示子项(用流构建器包装的文章列表)。

这工作正常。但是让我烦恼的是我将 Stream builder 包装在流构建器中。我知道我可以得到 rxdart 的帮助,但我不确定如何。

我试图在 snapshot.hasData 的帮助下添加一个加载器,但没有奏效,所以我决定创建另一个流和主题,它接受一个布尔值并告诉 UI 它是否正在加载。

代码在块中获取数据:

 _getAndUpdateArticles(StoryType storyType) {
    _isLoadingSubject.add(true);
    getListIds(storyType).then((list) {
      getArticles(list.sublist(0, 10)).then((_){
        _articleSubject.add(UnmodifiableListView(_articles));
        _isLoadingSubject.add(false);
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

用户界面:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: StreamBuilder(
        stream: widget.hnBloc.isLoading,
        builder: (context, snapshot) {
          if (snapshot.data) {
            return Center(child: CircularProgressIndicator());
          } else {
            return StreamBuilder<UnmodifiableListView<Article>> (
              initialData: UnmodifiableListView<Article>([]),
              stream: widget.hnBloc.article, …
Run Code Online (Sandbox Code Playgroud)

flutter rxdart bloc

8
推荐指数
1
解决办法
4973
查看次数

Flutter BLoC - 如何将参数传递给事件?

尝试学习 BLoCs 我想出了这个问题。我有一些代码,我在其中生成了一些带有 BLoC 模式的按钮。但是,我不知道如何使用dispatch(event)方法更新特定的按钮属性。如何将参数传递给事件ChangeSomeValues

使用 BLoC 的部分

BlocBuilder(
  bloc: myBloc,
  builder: (context, state) {
    return ListView.builder(
      itemCount: state.buttonList.length,
      itemBuilder: (context, index) {
        return MyButton(
          label: buttonList[index].label,
          value: buttonList[index].value,
          onPressed: myBloc.dispatch(ChangeSomeValues()),
        );
      }
    );
  }
),
Run Code Online (Sandbox Code Playgroud)

MyBloc.dart

class MyBloc extends Bloc<MyEvent, MyState> {

  @override
  Stream<MyState> mapEventToState(MyEvent event) async* {
    if (event is ChangeSomeValues) {
      ... modify specific parameters in list here ...
      yield MyState1(modifiedList);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道如何使用事件来更改值,但我找不到如何使用这种通用实现来编辑列表中的特定参数。

parameters events dart flutter bloc

8
推荐指数
1
解决办法
7883
查看次数

尝试热重载 Flutter 应用程序会重新启动整个应用程序

我正在开发 Flutter 应用程序,我注意到每当我保存我的应用程序以查看更新的更改时,我的整个应用程序都会重新加载。我希望我打开的页面可以热加载我的新更改。

我认为我的小部件树的组织方式可能会对此产生影响。我的整个应用程序都包含在一个在启动时运行的小部件中,该小部件会初始化为 ServicesLoadingState。然后,在服务完成启动后(在 BLoC 中),它产生一个 ServicesReadyState,然后绘制我的所有小部件。我认为当我热重载时,最上面的小部件的状态会切换回 ServicesLoadingState,重新加载服务,并向我展示我正在经历的行为。

我试过谷歌搜索“flutter hot reload restarts app”,但我没有找到任何关于如何防止这种情况的好提示。如何阻止热重载重新启动整个应用程序?

flutter bloc

8
推荐指数
1
解决办法
905
查看次数

如何在 initState 方法中访问 flutter bloc?

在下面显示的代码中,在获取 BuildContext 对象后从 build 方法中调用 dispatch 事件。如果我希望做的是在 initState 方法本身内的页面开始处理期间分派事件怎么办?

如果我使用 didChangeDependencies 方法,那么我会收到这个错误: BlocProvider.of() called with a context that does not contain a Bloc of type FileManagerBloc.如何解决这个问题?

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: BlocProvider<FileManagerBloc>(
          builder: (context)=>FileManagerBloc(),
          child: SafeArea(
      child: Container(
          child: Column(
            children: <Widget>[
              Container(color: Colors.blueGrey, child: TopMenuBar()),
              Expanded(
                child: BlocBuilder<FileManagerBloc,FileManagerState>(
                  builder: (context , state){
                    return GridView.count(
                      scrollDirection: Axis.vertical,
                      physics: ScrollPhysics(),
                      crossAxisCount: 3,
                      crossAxisSpacing: 10,
                      children: getFilesListWidget(context , state),
                    );
                  },
                ),
              )
            ],
          ),
      ),
    ),
        )); …
Run Code Online (Sandbox Code Playgroud)

dart flutter bloc

8
推荐指数
2
解决办法
9036
查看次数