我在 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 中创建的,因此应用程序内的每个小部件都应该可以访问它?
尝试将您的孩子包装起来:GoogleSignUp 在 Provider 中使用 Builder 小部件