Search code examples
flutterdartrxdart

How acess provider outside a Widget?


I have an application that I making some tests with RxDart using observables and subjects. So I make this code:

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;

... the code goes on!

I want to get a provider data like this CompanyController companyController = new Provider.of<CompanyController>(context, listen: false); Where I put CompanyController companyController = new CompanyController();

But I don't have a context and I need this instance to make the RxDart subject and observables to work together.


Solution

  • You need a reference to the context in order to use the Provider, the State object has a reference as a field of its class, but this reference shouldn't be used before initState() is called, so just use the reference you need inside initState() and create everything you need there:

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

    Also, remember to dispose all objects that need to be disposed at dispose().