我想模拟我的集团以测试我的观点。
例如,这是我的 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 架构编写一个应用程序,并在 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 一起使用,但不知道如何注册它?是否可以?谢谢
我使用 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) 嘿,我一直将块观察者作为我的 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) 在 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()。
我正在使用 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) 尝试学习 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)
我知道如何使用事件来更改值,但我找不到如何使用这种通用实现来编辑列表中的特定参数。
我正在开发 Flutter 应用程序,我注意到每当我保存我的应用程序以查看更新的更改时,我的整个应用程序都会重新加载。我希望我打开的页面可以热加载我的新更改。
我认为我的小部件树的组织方式可能会对此产生影响。我的整个应用程序都包含在一个在启动时运行的小部件中,该小部件会初始化为 ServicesLoadingState。然后,在服务完成启动后(在 BLoC 中),它产生一个 ServicesReadyState,然后绘制我的所有小部件。我认为当我热重载时,最上面的小部件的状态会切换回 ServicesLoadingState,重新加载服务,并向我展示我正在经历的行为。
我试过谷歌搜索“flutter hot reload restarts app”,但我没有找到任何关于如何防止这种情况的好提示。如何阻止热重载重新启动整个应用程序?
在下面显示的代码中,在获取 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)