gopal
gopal

Reputation: 355

Provider in init method of main.dart

Can I use provider in init method of the main.dart file ?

I tried using the SchedulerBinding.instance.addPostFrameCallback method as a callback but I get exception.

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutterdev/pages/product_list.dart';
import 'package:flutterdev/state/user.dart';
import 'package:provider/provider.dart';
// import 'package:flutter/rendering.dart';

import './pages/auth.dart';
import './pages/products_admin.dart';
import './pages/products.dart';
import './pages/product.dart';
import './state/products.dart';
import './state/user.dart';
import './models/product.dart';

void main() {
  // debugPaintSizeEnabled = true;
  // debugPaintBaselinesEnabled = true;
  // debugPaintPointersEnabled = true;
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    SchedulerBinding.instance.addPostFrameCallback((_) {

      UserProvider userProvider = Provider.of<UserProvider>(context);
      userProvider.autoAuthenticate();

    });

    // () async {
    //  await Future.delayed(Duration.zero);

    //}();
  }

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(builder: (_) => ProductsProvider()),
        ChangeNotifierProvider(builder: (_) => UserProvider()),
      ],
      child: MaterialApp(
        // debugShowMaterialGrid: true,
        theme: ThemeData(
            brightness: Brightness.light,
            primarySwatch: Colors.deepOrange,
            accentColor: Colors.deepPurple,
            buttonColor: Colors.deepPurple),

        // home: AuthPage(),
        routes: {
          '/': (BuildContext context) =>
              Consumer<UserProvider>(builder: (context, userProvider, _) {
                final ProductsProvider productsProvider =
                    Provider.of<ProductsProvider>(context);
                String token = "";

                if (userProvider.authenticatedUser != null) {
                  token = userProvider.authenticatedUser.token;
                }

                return userProvider.authenticatedUser == null
                    ? AuthPage()
                    : ProductListPage(productsProvider, token);
              }),

        },
      ),
    );
  }
}

I am getting an exception. I am lost on how lift up the multiprovider above the widget to make it work. I tried to move it to createstate and main method. I dont understand how to do it.


flutter: ══╡ EXCEPTION CAUGHT BY SCHEDULER LIBRARY ╞═════════════════════════════════════════════════════════
flutter: The following ProviderNotFoundError was thrown during a scheduler callback:
flutter: Error: Could not find the correct Provider<UserProvider> above this MyApp Widget
flutter:
flutter: To fix, please:
flutter:
flutter:   * Ensure the Provider<UserProvider> is an ancestor to this MyApp Widget
flutter:   * Provide types to Provider<UserProvider>
flutter:   * Provide types to Consumer<UserProvider>
flutter:   * Provide types to Provider.of<UserProvider>()
flutter:   * Always use package imports. Ex: `import 'package:my_app/my_code.dart';
flutter:   * Ensure the correct `context` is being used.
flutter:
flutter: If none of these solutions work, please file a bug at:


Upvotes: 0

Views: 2617

Answers (1)

gopal
gopal

Reputation: 355

Below code works. I moved the provider setup to runApp and received the userprovider as argument in MyApp.

 runApp(
    ChangeNotifierProvider<UserProvider>(
      builder: (ctx) => UserProvider(),

     child:    Consumer<UserProvider>(
        builder: (context, userprovider, _) {
         return MyApp(userprovider);
        }
      ) 
      ),    
  );


Upvotes: 2

Related Questions