Dart中替换嵌套Map的search变量?解决初始化器成员访问报错
解决Dart类中初始化器访问实例成员错误及动态替换Map参数问题
错误原因
Dart中,实例变量的初始化器会在类的构造函数执行之前运行,此时实例还未完全初始化,因此无法访问其他实例成员(比如你定义的search变量),这就是报错“实例成员'search'无法在初始化器中访问”的根本原因。
同时你的需求是将filterFetchService方法的参数search替换到singleProductVariable的search字段中,直接在初始化器中赋值显然无法满足动态更新的需求,需要调整实现方式。
解决方案
方案一:将Map改为动态生成的方法(推荐)
把singleProductVariable改成一个接收search参数的方法,每次调用时生成包含最新search值的Map,既解决初始化问题,又能动态传入参数:
class Data { String search = "Something "; // 定义方法生成带指定search参数的Map Map<String, Map<String, Object>> getSingleProductVariable(String search) { return { "productPrams": { "search": search, "seller": "", "limit": 10, "skip": "", "order": "aesc", "sortBy": "_id", "category": "", "treeCategory": [], "subCategory": "", "brand": "", "price": [], "visibility": true, "approved": true } }; } Future<FilterProductsModel> filterFetchService(String search) async { QueryResult queryResult = await qlclient.query( QueryOptions( document: gql(QueryDocument.filters), // 调用方法传入当前search参数 variables: getSingleProductVariable(search)), ); Map<String, dynamic> data = queryResult.data as Map<String, dynamic>; var body = FilterProductsModel.fromJson(data); print(data); return body; } }
这种方式的优势是每次调用都会生成全新的Map,避免多线程或多次调用时的参数冲突,逻辑更清晰。
方案二:构造函数初始化实例变量,方法内动态更新参数
如果需要保留singleProductVariable作为实例变量,可以用late修饰延迟初始化,在构造函数中完成初始化,然后在方法内更新search字段:
class Data { String search = "Something "; // 用late修饰,延迟初始化 late Map<String, Map<String, Object>> singleProductVariable; Data() { // 在构造函数中初始化Map,此时实例已创建,可访问search成员 singleProductVariable = { "productPrams": { "search": search, "seller": "", "limit": 10, "skip": "", "order": "aesc", "sortBy": "_id", "category": "", "treeCategory": [], "subCategory": "", "brand": "", "price": [], "visibility": true, "approved": true } }; } Future<FilterProductsModel> filterFetchService(String search) async { // 更新Map中的search值为方法参数 singleProductVariable["productPrams"]!["search"] = search; QueryResult queryResult = await qlclient.query( QueryOptions( document: gql(QueryDocument.filters), variables: singleProductVariable), ); Map<String, dynamic> data = queryResult.data as Map<String, dynamic>; var body = FilterProductsModel.fromJson(data); print(data); return body; } }
注意:这种方式下singleProductVariable是可变的实例变量,如果存在并发调用filterFetchService的场景,可能会出现参数覆盖的问题,需要根据实际业务场景评估是否适用。
内容的提问来源于stack exchange,提问作者Lujo Morvic
相关产品推荐
相关产品推荐

