Flutter Provider中动态为Map赋值_slug的报错解决
解决Dart实例成员无法在初始化器中访问的问题
问题原因
Dart类的成员初始化器在实例创建前执行,此时实例成员_slug还未完成初始化,因此直接在singleProductVariable的初始化器中引用_slug会报错。添加static虽然能绕过错误,但static变量属于类而非单个实例,无法实现每个实例独立动态更新slug的需求。
解决方案
将singleProductVariable改为计算属性(getter),每次访问时都会基于当前实例的_slug生成最新的Map,确保动态获取当前的slug值:
class SingleProductFetchProvider extends ChangeNotifier { late String _slug; void onClicked(BuildContext context, {required String slug}) { _slug = slug; notifyListeners(); Navigator.pushNamed( context, MyRoutes.productDetails, ); } // 改为getter,每次访问时生成包含最新_slug的Map Map<String, String> get singleProductVariable => {"slug": _slug}; Future<ProductDetailsModel> singleProductFetch() async { QueryResult queryResult = await qlclient.query( QueryOptions( document: gql(QueryDocument.productDetailsSingle), variables: singleProductVariable), // 此处自动获取最新的slug ); var data = queryResult.data as Map<String, dynamic>; var body = ProductDetailsModel.fromJson(data); return body; } }
说明
- 计算属性
singleProductVariable不会提前初始化,而是在每次被访问时才计算并返回包含当前_slug的Map,完美实现动态赋值的需求。 - 当
onClicked方法更新_slug并调用notifyListeners()后,依赖该Provider的组件会重新构建,此时访问singleProductVariable也会拿到最新的slug值。
内容的提问来源于stack exchange,提问作者jipahe827
相关产品推荐
相关产品推荐

