gpt4 book ai didi

flutter - Flutter:在流类中访问SharedPreferences提供程序/ChangeNotifier

转载 作者:行者123 更新时间:2023-12-03 04:20:30 24 4
gpt4 key购买 nike

我在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。
  • 我无法访问此类中的上下文以从提供程序获取数据
  • 无法将userId发送到getCompaniesProfiles getter,因为getter不接受参数
  • 如果我将此getter转换为常规方法,我将无法向其发送userID,因为它必须在下运行main(){runApp(MyApp());} / return MultiProvider(提供者:[ 并且到那时,我无法使用不包含提供者信息的上下文调用fetch sharedPreferences ...
  • 无法弄清楚如何在此类中以构造函数的形式接收上下文,当我这样做时,得到以下内容:只有静态成员可以在DatabaseService类中的初始化程序中访问。

  • 我仍然是初学者,因此,如果您能与我分享处理此问题的最佳方法,我将不胜感激。
    谢谢!
    ***********通过添加以下内容进行重新编辑:**************
    我正在尝试实现相同的场景,这是我的代码:
    主文件:
    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');不运行。
    我想念什么?为什么未触发ChangeNotifierProxyProvider来更新DS文件中的dbData?谢谢!

    最佳答案

    您可以为此使用ProxyProviderProxyProvider是一个基于其他提供程序建立值的提供程序。
    您说您有一个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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com