Widget外如何访问提供者?

How acess provider outside a Widget?

我有一个应用程序,我使用 RxDart 使用可观察对象和主题进行一些测试。所以我做了这个代码:

class CompanyList extends StatefulWidget {
  const CompanyList({Key key}) : super(key: key);
  @override
  State<StatefulWidget> createState() => new CompanyListState();
}

class CompanyListState extends State<CompanyList> {
  CompanyController companyController = new CompanyController();
  List<dynamic> companyList = [];

  @override
  void initState() {
    super.initState();
    getActiveCompanys();    
    companyController.loadMoreData$.listen((value) {
      print(value);
    });
  }

  @override
  void dispose() {
    super.dispose();
  }

  getActiveCompanys() async {
    companyController.getActiveCompanys().then((value) {
      for (var i = 0; i < 10; i++) {
        setState(() {
          companyList.add(value[i]);
        });
      }
    }).catchError((_) {
      print('ENTROU NO ERRO');
    });
  }

  getCompanyData(company) {
    Navigator.push(
      context,
      PageTransition(
        type: PageTransitionType.leftToRight,
        child: CompanyScreen(
          company: company,
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    final double screenHeight = MediaQuery.of(context).size.height;
    final double screenWidth = MediaQuery.of(context).size.width;

...代码继续!

我想获得这样的提供商数据 CompanyController companyController = new Provider.of<CompanyController>(context, listen: false); 我把 CompanyController companyController = new CompanyController();

但是我没有上下文,我需要这个实例来使 RxDart 主题和可观察对象一起工作。

您需要引用 context 才能使用 ProviderState 对象有一个引用作为其 class 的字段,但是这个在调用 initState() 之前不应使用引用,因此只需在 initState() 中使用您需要的引用并在那里创建您需要的所有内容:

initState() {
  super.initState();
  companyController = new Provider.of<CompanyController>(context, listen: false);

  // use companyController here. 
... 
} 

此外,请记住在 dispose() 处理所有需要处理的对象。