- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
bối cảnh
我正在尝试创建一个具有两个屏幕的 Flutter 应用程序:ContactsScreen
Và EditContactScreen
.在 ContactsScreen
, 用户将看到 DropdownButton
Và Chữ
. DropdownButton
拥有 Liên hệ
的列表通过 api 获取的对象。每当用户选择 Liên hệ
từ DropdownButton
, Chữ
对象将显示有关该特定联系人的信息。此外,根据 Liên hệ
选择,一个RaisedButton
将出现,单击后会将用户定向到 EditContactScreen
编辑选定的 Liên hệ
.我正在使用 BloC 模式。我创建了两个 BloC,每个屏幕一个:ContactsScreenBloc
Và EditContactScreenBloc
. ContactsScreenBloc
持有Stream
và một Sink
用于管理选定的 Liên hệ
.鉴于 EditContactScreenBloc
vì Liên hệ
保留流和汇领域。最后,我有一个 GlobalBloc
包含 Liên hệ
的列表秒。 GlobalBloc
是一个 InheritedWidget
包裹了 MaterialApp
.该应用程序过于简单,并且是更大应用程序的一部分,因此,我无法合并 ContactsScreenBloc
Và EditContactScreenBloc
, 并且应该有一个 GlobalBloc
có Liên hệ
的列表
câu hỏi
我实际上是 Flutter 的新手,所以我不确定我的方法是否合理。如果是,则当用户导航到 EditContactScreen
时并成功更新 Liên hệ
, 我怎样才能在选择的 Liên hệ
中反射(reflect)出来呢?在ContactsScreen
?
代码片段
contact.dart
class Contact {
final String id;
final String firstName;
final String lastName;
final String phoneNumber;
Contact({this.id, this.firstName, this.lastName, this.phoneNumber});
Contact.fromJson(Map parsedJson)
: id = parsedJson['id'],
firstName = parsedJson['firstName'],
lastName = parsedJson['lastName'],
phoneNumber = parsedJson['phoneNumber'];
copyWith({String firstName, String lastName, String phoneNumber}) => Contact(
id: id,
firstName: firstName ?? this.firstName,
lastName: lastName ?? this.lastName,
phoneNumber: phoneNumber ?? this.phoneNumber
);
@ghi đè
bool operator ==(other) => other.id == this.id;
@ghi đè
int get hashCode => id.hashCode;
}
global.bloc.dart
class GlobalBloc {
final _repo = Repo();
final _contacts = BehaviorSubject<>>(seedValue: []);
Stream<>> get contacts => _contacts.stream;
Function(List) get updateContacts => _contacts.sink.add;
Future refreshContacts() async{
final contacts = await _repo.getContacts();
updateContacts(contacts);
}
}
contacts_screen.bloc.dart
class ContactsScreenBloc {
final _selectedContact = BehaviorSubject(seedValue: null);
Stream get selectedContact => _selectedContact.stream;
Function(Contact) get changeSelectedContact => _selectedContact.sink.add;
}
edit_contacts_screen.bloc.dart
class ContactsScreenBloc {
final _selectedContact = BehaviorSubject(seedValue: null);
Stream get selectedContact => _selectedContact.stream;
Function(Contact) get changeSelectedContact => _selectedContact.sink.add;
}
global.provider.dart
class GlobalProvider extends InheritedWidget {
final bloc = GlobalBloc();
static GlobalBloc of(BuildContext context) => (context.inheritFromWidgetOfExactType(GlobalProvider) as GlobalProvider).bloc;
bool updateShouldNotify(_) => true;
}
contacts.screen.dart
class ContactsScreen extends StatelessWidget {
final bloc = ContactsScreenBloc();
@ghi đè
Xây dựng tiện ích (BuildContext context) {
final globalBloc = GlobalProvider.of(context);
return Column(
trẻ em: [
StreamBuilder<>>(
stream: globalBloc.contacts,
builder: (context, listSnapshot) {
return StreamBuilder(
stream: bloc.selectedContact,
builder: (context, itemSnapshot) {
return DropdownButton(
items: listSnapshot.data
?.map(
(contact) => DropdownMenuItem(
value: contact,
child: Text(contact.firstName + ' ' + contact.lastName),
),
)
?.toList(),
onChanged: bloc.changeSelectedContact,
hint: Text('Choose a contact.'),
value: itemSnapshot.hasData ? itemSnapshot.data : null,
);
},
);
},
), // end for DropdownButton StreamBuilder
StreamBuilder(
stream: bloc.selectedContact,
builder: (context, snapshot) {
return snapshot.hasData
? Row(children: [
Text(snapshot.data.firstName + ' ' + snapshot.data.lastName + ' ' + snapshot.data.phoneNumber),
FlatButton(
child: Text('Edit Contact'),
onPressed: () {
Navigator.of(context).push(MaterialPageRoute(
builder: (context) =>
EditContactScreen(contact: snapshot.data)));
},
),
],
)
: null;
}, // End for text description
)
],
);
}
}
edit_contact.screen.dart
class EditContactScreen extends StatelessWidget {
final bloc = EditContactScreenBloc();
final Contact contact;
EditContactScreen({this.contact});
@ghi đè
Xây dựng tiện ích (BuildContext context) {
final globalBloc = GlobalProvider.of(context);
return Column(
trẻ em: [
TextField(onChanged: (firstName) => bloc.updateContact(contact.copyWith(firstName: firstName))),
TextField(onChanged: (lastName) => bloc.updateContact(contact.copyWith(firstName: lastName))),
TextField(onChanged: (phoneNumber) => bloc.updateContact(contact.copyWith(firstName: phoneNumber))),
RaisedButton(child: Text('Update'), onPressed: () async {
await bloc.update();
await globalBloc.refreshContacts();
Navigator.of(context).pop();
},)
],
);
}
}
câu trả lời hay nhất
好的,我能够解决我的问题:
hiện hữucontacts_screen.bloc.dart
,我添加了以下方法:
void updateContactInfo(List contacts) {
final contact = _selectedContact.value;
if (contact == null) return;
final updatedContact = contacts.firstWhere((a) => a.id == contact.id);
if (updatedContact == null) return;
changeSelectedContact(updatedContact);
}
并更新了StreamBuilder<>
用于构建 DropdownButton
变成这样:
StreamBuilder<>>(
stream: globalBloc.contacts,
builder: (context, listSnapshot) {
bloc.updateContactInfo(listSnapshot.data);
return StreamBuilder(
stream: bloc.selectedContact,
builder: (context, itemSnapshot) {
return DropdownButton(
items: listSnapshot.data
?.map(
(contact) => DropdownMenuItem(
value: contact,
child: Text(
contact.firstName + ' ' + contact.lastName),
),
)
?.toList(),
onChanged: bloc.changeSelectedContact,
hint: Text('Choose a contact.'),
value: itemSnapshot.hasData ? itemSnapshot.data : null,
);
},
);
},
)
关于dart - Flutter 区 block 模式 : Update BloC Streams Based Another BloC's Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53918475/
这几天我一直在学习 Flutter 中的 Bloc Pattern。 我有一个页面需要生成 OTP 并对其进行验证。 有两个 API(generateOtp、validateOtp)两个实现了这个功能
我目前正在创建一个原型(prototype)项目,它实现了很多功能,如导航管理、错误管理、存储管理等 我现在面临一个关于 Bloc 的问题。我想知道哪些是使用 blocs 的最佳实践,事实上,假设我有
我在 Flutter 工作了很长时间,并且有很多已发布的产品。我从来不喜欢 BLoC,更喜欢使用 Provider 或后来的 Riverpod。 我只是不明白那个事件的概念。为什么我们还需要它?我很困
我对 Flutter 和 BLoC 模式还比较陌生,所以我仍在尝试了解所有内容。 假设我有一个测验应用程序,其中有一个名为 QuestionBloc 的 BLoC它使用存储库从文件中获取问题。事件于Q
我正在使用这个包:https://pub.dartlang.org/packages/bloc .我有两个 View :在第一个 View 中,我使用“bloc1”显示元素列表,通过 Floating
Bloc 相对于 Cubit 的实际优势是什么? 除了可追溯性(您也可以通过适当的 Cubit 日志记录来实现)和高级事件转换(我想不出任何“高级”事件Cubit 无法执行的转换,因为总有一种方法可以
我正在使用 Bloc 模式开发 Flutter 应用程序。认证成功后,UserSate 有 User 对象。在所有其他 Bloc 中,我需要访问 UserState 中的 User 对象。我尝试在其他
我有两个BLoC。 EstateBloc EstateTryBloc 我的应用程序基本上是从API获取遗产,并以类似的fashion显示它们 现在,我想添加排序功能,但是我只能通过特定状态访问遗产 l
这是 Bloc (简体): import 'package:autobleidas_flutter/bloc/bloc_base.dart'; import 'package:firebase_aut
我目前正在将我的代码重构为 bloc 模式,并为屏幕创建了一个 bloc,该屏幕从 Assets 中的 json 文件中获取位置列表。事件是获取,状态是初始、加载和加载。 在我的 UI 屏幕上,我想使
我有一个包含 2 个页面的应用程序,当点击主页按钮时,它会导航到“设置”页面。 IconButton( onPressed:(){ Navigator.push(
我有这些针对腕尺状态的密封类: part of 'logged_out_nickname_cubit.dart'; @freezed abstract class LoggedOutNickNameS
我的项目是一个使用 flutter、dart(前端)和 Nodejs 作为后端的社交网络混合移动应用程序, 我聘请的前端开发人员使项目的一部分(占项目的 35%)使用 GetX 作为状态管理,然后在某
Error: I/flutter ( 5919): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═════════════════════════════════
我是 Flutter 和 Bloc 架构的新手,我正在尝试使用 Bloc 来实现我的登录功能。我正在尝试调用我的 Bloc 文件中的函数,但我不知道该怎么做。如果您能帮我看看我在使用 Bloc 时是否
在使用 BLoC 库时,我们将所有变量存储在一个状态类中。但是在哪里存储TextEditingController,它不会改变,但它的值会改变? 假设我有一个这样的状态类(仅作为示例): @freez
场景 我正在尝试创建一个具有两个屏幕的 Flutter 应用程序:ContactsScreen和 EditContactScreen .在 ContactsScreen , 用户将看到 Dropdow
我在尝试在 DartPad 上运行我的代码时遇到了这个问题。 'runZoned' is deprecated and shouldn't be used. This will be removed
我在尝试在 DartPad 上运行我的代码时遇到了这个问题。 'runZoned' is deprecated and shouldn't be used. This will be removed
产品 Bloc 类 final ProductRepositoryImpl _productRepositoryImpl; ProductBloc(this._productRepositor
Tôi là một lập trình viên xuất sắc, rất giỏi!