You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:45:43