- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在StackoverFlow中四处张望,却找不到自己的解决方案。
场景:
我有一个带有ChangeNotifier类的Flutter SharedPreferences提供程序,它将使用当前的“登录用户”信息进行更新。
简化内容:
class SharedPreferences {
final String userId;
final String userName;
SharedPreferences({
@required this.userId,
@required this.userName,
});
}
class SharedPreferencesData with ChangeNotifier {
var _sharedPreferencesData = SharedPreferences(
userId: 'testUserId',
userName: 'testUserName',
);}
还有一个带有Class的database.dart文件,其中包含DataBaseServices以从快照获取FireStore流:
class DatabaseService {
final CollectionReference companiesProfilesCollection =
Firestore.instance.collection('companiesProfiles');
List<CompanyProfile> _companiesProfilesFromSnapshot(QuerySnapshot snapshot) {
return snapshot.documents.map((doc) {
return CompanyProfile(
docId: doc.documentID,
companyName: doc.data['companyName'] ?? '',
maxLocationsNumber: doc.data['maxLocationsNumber'] ?? 0,
maxUsersNumber: doc.data['maxUsersNumber'] ?? 0,
);
}).toList();
}
Stream<List<CompanyProfile>> get getCompaniesProfiles {
return companiesProfilesCollection
.where('userId', isEqualTo: _userIdFromProvider)
// My problem is above -----
.snapshots()
.map(_companiesProfilesFromSnapshot);
}
}
我不想获取整个Stream数据,因为它对于其他Streams可能是巨大的,我只想在.where('userId',isEqualTo:_userIdFromProvider)下传递userID。
return MultiProvider(
providers: [
ChangeNotifierProvider<SpData>(
create: (context) => SpData(),
),
ProxyProvider<SpData, DS>(
create: (context) => DS(),
update: (ctx, spData, previousDS) {
print('ChangeNotifierProxyProvider RAN');
previousDS.dbData = spData;
return previousDS;
},
),
],
SP文件:
class SP {
final String companyId;
SP({
@required this.companyId,
});
}
class SpData with ChangeNotifier {
var _sPData = SP(
companyId: '',
);
void setCompanyId(String cpID) {
final newSharedPreferences = SP(
companyId: cpID,
);
_sPData = newSharedPreferences;
print('_spData companyId:${_sPData.companyId}');
notifyListeners();
}
String get getCompanyId {
return _sPData.companyId;
}
}
DS文件:
class DS with ChangeNotifier {
SpData dbData;
void printCompanyId() {
var companyId = dbData.getCompanyId;
print('companyId from DataBase: $companyId');
}
}
SpData dbData; DS类中的内容不会更新。我添加了打印件以找出正在运行的内容和未运行的内容。当我运行代码时,main.dart文件中的打印功能为print('ChangeNotifierProxyProvider RAN');不运行。
最佳答案
您可以为此使用ProxyProvider
。ProxyProvider
是一个基于其他提供程序建立值的提供程序。
您说您有一个MultiProvider
,所以我想您在此SharedPreferencesData
中有MultiProvider
提供程序,然后在DatabaseService
提供程序中。您需要做的是将ProxyProvider
用作DatabaseService
而不是常规提供程序,并将其基于SharedPreferencesData
提供程序。
这是一个例子:
MultiProvider(
providers: [
ChangeNotifierProvider<SharedPreferencesData>(
create: (context) => SharedPreferencesData(),
),
ProxyProvider<SharedPreferencesData, DatabaseService>(
create: (context) => DatabaseService(),
update: (context, sharedPreferencesData, databaseService) {
databaseService.sharedPreferencesData = sharedPreferencesData;
return databaseService;
},
dispose: (context, databaseService) => databaseService.dispose(),
),
],
child: ...
这是上面的代码片段中发生的事情:
ProxyProvider
每当update
更改时调用SharedPreferencesData
。 DatabaseService
将其sharedPreferencesData
变量设置在update
内部。 sharedPreferencesData
实例中的
DatabaseService
,您可以轻松地执行所需的操作。
关于flutter - Flutter:在流类中访问SharedPreferences提供程序/ChangeNotifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62895578/
我是 Flutter 新手,并且一直坚持这个我有一个页面使用名为 GoogleMapsNotifier 和 ChangeNotifier 的类,当我弹出页面时,我想在该类中处理 Stream(最后一个
从文档中我了解到,可以在 ChangeNotifier 上调用 addListener()实例将自定义监听器添加到堆栈中。 此方法接受零参数的回调(根据 notifyListeners() ),例如:
在flutter sample在解释如何使用 Provider 包时,有两个模型,Catalog 和 Model。对于 Catalog 模型,不使用 ChangeNotifier,但对于 Cart 模
在flutter sample在解释如何使用 Provider 包时,有两个模型,Catalog 和 Model。对于 Catalog 模型,不使用 ChangeNotifier,但对于 Cart 模
ChangeNotifier 的 flutter 文档说 ChangeNotifier is optimized for small numbers (one or two) of listeners
在我的项目中,当 ChangeNotifier类收到一个状态,它设置一个 bool 值并调用 notifyListeners() .在我的主要 build()函数,然后我检查pending-boole
我使用Provider / ChangenNotifier模式来处理状态,如in the official docs所述。 我有一个状态字段,要在构建小部件后设置。但是,如果我尝试在build方法中进
我在StackoverFlow中四处张望,却找不到自己的解决方案。 场景: 我有一个带有ChangeNotifier类的Flutter SharedPreferences提供程序,它将使用当前的“登录
当我在提供程序类中调用此对象的一个项目时,我调用一个 api 并将其结果放入一个对象中,但是当我从提供程序类中调用此变量时,有时它被填充但有时它为空。如何? 我这样称呼这个提供者类 await
我在 Model 中有要执行的代码。我使用 Provider 提供 Model。但是如果 Model 在完成执行之前被释放,我会得到错误: E/flutter (26180): [ERROR:flut
背景 ValueNotifier 有一个 ValueListenableBuilder 小部件。 Stream 有一个 StreamBuilder 小部件。 Future 有一个 FutureBuil
我想为我的应用程序实现 Provider,在做了一些研究之后,我发现我必须为我的 Data 类实现 ChangeNotifier 才能在“天”更改时更新 UI。 我见过有人在 setter 方法中编写
情况:我正在看一个带有 Win32::ChangeNotify 的文件夹(这里不关心跨平台)。该文件夹共享到本地网络。将从另一台计算机在此文件夹中创建一个文件。这个过程需要一些时间。 问题:当文件仍在
我有一个 sqlite 数据库,我从中读取数据。我还有一棵很长的小部件树。因此,经过一些研究,我找到了 provider Flutter 包。但是我不知道如何在扩展 ChangeNotifier 的类
我安装了 File::ChangeNotify在 Windows 系统上并尝试运行以下代码: my $watcher = File::ChangeNotify->instantiate_wa
在我的 Flutter 应用程序中,我有一个小部件 class HomeScreen extends StatelessWidget 使用模型 class HomeScreenModel extend
#!/opt/perl_5.18.2/linux50/bin/perl use strict; #use warnings; use File::ChangeNotify; $| = 1; my $w
我有一个 ChangeNotifier,我想在多个路由之间共享它,但不是所有路由: Page1 是我的第一页。我只需要与 Page2、Page3 和 Page 共享 ChangeNotifierPro
#!/opt/perl_5.18.2/linux50/bin/perl use strict; #use warnings; use File::ChangeNotify; $| = 1; my $w
我想将我的整个项目从 provider 转移到 riverpod。但我卡在了这一点上。 class EditQuestionScreen extends StatelessWidget { Edi
我是一名优秀的程序员,十分优秀!