我遵循 BLoC 模式并订阅流,并对构建方法中的状态变化做出反应。加载数据后,我想关闭屏幕。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Bloc'),
),
body: SafeArea(
child: StreamBuilder<UserState>(
stream: _userBloc.user,
initialData: UserInitState(),
builder: (context, snapshot) {
if (snapshot.data is UserInitState) {
return _buildInit();
}
if (snapshot.data is UserDataState) {
Navigator.pop(context, true);
return Container();
}
if (snapshot.data is UserLoadingState) {
return _buildLoading();
}
},
),
),
);
}
Run Code Online (Sandbox Code Playgroud)
当我Navigator.pop(context, true);使用build()方法时,我得到:
I/flutter ( 4360): ??? EXCEPTION CAUGHT BY ANIMATION LIBRARY ??????????????????????????????????????????????????????????
I/flutter ( 4360): The following …Run Code Online (Sandbox Code Playgroud) 有人知道我该怎么做吗?
我的代码:
@override
void dispose() {
final FiltersBloc filtersBloc =
BlocProvider.of<FiltersBloc>(context);
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
错误是:
flutter: BlocProvider.of() called with a context that does not contain a Bloc of type FiltersBloc.
flutter: No ancestor could be found starting from the context that was passed to
flutter: BlocProvider.of<FiltersBloc>().
flutter:
flutter: This can happen if:
flutter: 1. The context you used comes from a widget above the BlocProvider.
flutter: 2. You used MultiBlocProvider and didn't explicity provide the BlocProvider types.
flutter:
flutter: Good: BlocProvider<FiltersBloc>(builder: …Run Code Online (Sandbox Code Playgroud) 所以我通读Bloc了状态管理flutter。
由于 Bloc 允许您下沉和流式传输(根据输入重建小部件),那么是否有可能主要使用无状态小部件来构建应用程序?
例如,假设我制作了许多单个无状态类小部件,因此几乎所有东西都被划分为自己的无状态小部件。
使用 Bloc 状态管理,我可以简单地重建某个无状态的子小部件来反映更改。
在这种方法中,我认为不需要使用有状态小部件。当然,作为一个完全的初学者flutter,我想听听这种方法是否有任何优点。
这是一个好方法吗?任何信息将不胜感激。
示例状态:
abstract class ExampleState extends Equatable {
const ExampleState();
}
class LoadingState extends ExampleState {
//
}
class LoadedState extends ExampleState {
//
}
class FailedState extends ExampleState {
//
}
Run Code Online (Sandbox Code Playgroud)
示例_事件:
abstract class ExampleEvent extends Equatable {
//
}
class SubscribeEvent extends ExampleEvent {
//
}
class UnsubscribeEvent extends ExampleEvent {
//
}
class FetchEvent extends ExampleEvent {
//
}
Run Code Online (Sandbox Code Playgroud)
示例_块:
class ExampleBloc extends Bloc<ExampleEvent, ExampleState> {
@override
ExampleState get initialState => LoadingState();
@override
Stream<ExampleState> mapEventToState(
ExampleEvent event,
) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用终端运行颤振测试,但收到以下错误。以下文件 C:/Users/User/AppData/Local/Temp/flutter_test_listener.e6fa92b4-6cd1-11e9-b9cb-68f728ca4610/listener.dart 在指定的目录中不存在。
这是错误:
编译器消息:file:///C:/Users/User-45/AppData/Local/Temp/flutter_test_listener.e6fa92b4-6cd1-11e9-b9cb-68f728ca4610/listener.dart:46:17:
错误:找不到 Getter:'main'。返回 test.main;
我的项目目录在另一个文件夹中。我该如何解决这个问题?谢谢
TL;DR:有没有一种方法可以监听流并使用Cubit而不是发出状态BLoC?
我正在使用BLoCFlutter 库,我们使用Cubits 进行状态管理。到目前为止,获取数据或保存数据的交互一切正常,但现在我需要使用流。就我而言,这意味着观看来自 的快照FirebaseFirestore。
我尝试在互联网上搜索是否有方法观察流而Cubit不是使用BLoC,但大多数结果都指向我BLoC。我曾在另一个项目中工作过BLoC,所以我知道如何使用它来观察流,但Cubit如果有办法的话我想使用它。
以下是我在 FireStore 中观察的代码示例:
@override
Stream<Either<Failure, List<MTalk>>> watchTalk() async* {
const path ='path/to/talks';
yield* firestore
.collection(path)
.snapshots()
.map(
(snap) => right<Failure, List<MTalk>>(
snap.docs
.map(
(documentSnapshot) => MTalk.fromFirestore(documentSnapshot))
.toList(),
),
)
.onErrorReturnWith((e) {
if (e is FirestoreException) {
return left(RetrieveFailure(message: e.message));
} else {
return left(UnknownFailure(message: e.toString()));
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
使用时BLoC,只要从调用返回数据,您就可以简单地使用async* …
我想模拟我的集团以测试我的观点。
例如,这是我的 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) 我编写了一些简单的 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) 当我运行类似于以下代码的代码时,出现以下错误:使用不包含 Bloc 的上下文调用 BlocProvider.of()。
复制
BlocProvider(
create: (context) => getIt<TheBloc>()
child: BlocBuilder<TheBloc, TheState>(
build: (context, state) =>
MaterialButton(
onPressed: () => _showModal(context),
child: const Text('SHOW BLOC MODAL'),
),
Run Code Online (Sandbox Code Playgroud)
...
void _showModal(BuildContext context) {
showModalBottomSheet<void>(
context: context,
builder: (_) {
return MaterialButton(
onPressed() {
context.bloc<TheBloc>().add(
TheEvent.someEvent(),
);
}
child: Text('Press button to add event to bloc')
);
},
);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 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 一起使用,但不知道如何注册它?是否可以?谢谢