【问题标题】:use provider in two screens在两个屏幕中使用提供程序
【发布时间】:2022-12-03 20:56:26
【问题描述】:

我对供应商有一个问题。我不想创建全球供应商。我的意思是,为特定屏幕创建提供程序。我想在两个屏幕中使用相同的提供者而不创建另一个实例。 例如。

我的提供商(针对特定屏幕)


class ServiceScreenProvider with ChangeNotifier {
  final BuildContext _context;
  ServiceScreenProvider(this._context);
}

我的第一个屏幕(用于输入)

class ServiceScreen extends StatefulWidget {
  const ServiceScreen({Key? key}) : super(key: key);

  @override
  _ServiceScreenState createState() => _ServiceScreenState();
}

class _ServiceScreenState extends State<ServiceScreen> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ServiceScreenProvider>(
      create: (ctx) => ServiceScreenProvider(ctx),
      child: Column(
        children: const [
          ServiceLogo(),
          FormWidget(),
        ],
      ),
    );
  }
}

在这里,我是第一次创建提供者。 现在我想将此提供程序用于另一个屏幕

class ServiceDetailScreen extends StatefulWidget {
  const ServiceDetailScreen({Key? key}) : super(key: key);

  @override
  _ServiceDetailScreenState createState() => _ServiceDetailScreenState();
}

class _ServiceDetailScreenState extends State<ServiceDetailScreen> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: const [
        ServiceLogo(),
        FormWidget(),
      ],
    );
  }
}

text

我在打开新的 sServiceDetailScreen 时在 ServiceDetailScreen 屏幕的构造函数中传递了上下文。我正在使用 ServiceScreenProvider。

是否有任何其他方式来获取 ServiceScreenProvider 的实例而不在构造函数中传递上下文。

谢谢你。

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    Provider.of 方法允许您从小部件树中的任何位置访问提供者实例:

    class ServiceDetailScreen extends StatefulWidget {
      const ServiceDetailScreen({Key? key}) : super(key: key);
    
      @override
      _ServiceDetailScreenState createState() => _ServiceDetailScreenState();
    }
    
    class _ServiceDetailScreenState extends State<ServiceDetailScreen> {
      @override
      Widget build(BuildContext context) {
        return Column(
          children: [
            ServiceLogo(),
            FormWidget(),
            // Access the provider instance using the `Provider.of` method
            RaisedButton(
              onPressed: () {
                var provider = Provider.of<ServiceScreenProvider>(context);
                // Use the provider instance here
              },
            ),
          ],
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-16
      • 2021-07-18
      • 2021-01-14
      • 2019-01-17
      • 1970-01-01
      • 2021-07-12
      • 2021-11-15
      • 1970-01-01
      相关资源
      最近更新 更多