Flutter 提供程序:ProviderNotFoundException。发生这种情况是因为您使用的“BuildContext”不包含您选择的提供程序

问题描述 投票:0回答:1

我在 flutter 中遇到了 Provider 的问题。

创建 Provider 时有一个主页:

void main() async {
  await Supabase.initialize(
      url: <urlKey>,
      anonKey: <anonKey>);

  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Provider(
            create: (_) => DownloaderModel(),
            child: const GoogleSingUp()));
  }
}

然后我有 GoogleSignUpPage:

final supabase = Supabase.instance.client;

class GoogleSingUp extends StatefulWidget {
  const GoogleSingUp({ super.key });

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

class _GoogleSingUpState extends State<GoogleSingUp> {
  String? _userId;

  @override
  void initState() {
    super.initState();

    supabase.auth.onAuthStateChange.listen((data) {
      setState(() {
        _userId = data.session?.user.id;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(child: Column(
        children: [Text(_userId ?? 'Not signed in'), SignInButton(Buttons.Google, text: "Dupa", onPressed: () async {
          await _googleSignIn();
          if(context.mounted) {
            Navigator.pushReplacement<void, void>(context, MaterialPageRoute(builder: (context) => const DwarvesDownloader()));
          }
          
        })],
      ))
    );
  }

  Future<void> _googleSignIn() async {

  final GoogleSignIn googleSignIn = GoogleSignIn(
    clientId: iosClientId,
    serverClientId: webClientId,
  );
  final googleUser = await googleSignIn.signIn();
  final googleAuth = await googleUser!.authentication;
  final accessToken = googleAuth.accessToken;
  final idToken = googleAuth.idToken;

  if (accessToken == null) {
    throw 'No Access Token found.';
  }
  if (idToken == null) {
    throw 'No ID Token found.';
  }

  await supabase.auth.signInWithIdToken(
    provider: OAuthProvider.google,
    idToken: idToken,
    accessToken: accessToken,
  );
}
}

而我',尝试从 DwarvesDownloader 中的 Provider 访问 DownloaderModel:

class DwarvesDownloader extends StatelessWidget {
  const DwarvesDownloader({super.key});

  @override
  Widget build(BuildContext context) {
    DownloaderModel downloaderModel =
        Provider.of<DownloaderModel>(context, listen: false);

    return Center(
        child: FutureBuilder<void>(
            future: downloaderModel.fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.waiting) {
                return const CircularProgressIndicator();
              } else if (snapshot.hasError) {
                return Text('Error: ${snapshot.error}');
              } else {
                return const DwarvesListPage();
              }
            }));
  }
}

有人知道我为什么会遇到这样的问题吗?提供程序是在 main 中创建的,因此应用程序内的每个小部件都应该可以访问它?

flutter google-signin flutter-provider
1个回答
0
投票

尝试将您的孩子包装起来:GoogleSignUp 在 Provider 中使用 Builder 小部件

© www.soinside.com 2019 - 2024. All rights reserved.