簡體   English   中英

Flutter 登錄Provider AuthService

[英]Flutter login Provider AuthService

我的應用程序運行良好,但是在我使用 android 工作室更新整個 package 和 flutter 后,當我登錄/注冊時,它在登錄部分顯示錯誤如下:

======== Exception caught by gesture ===================================================
The following ProviderNotFoundException was thrown while handling a gesture:
Error: Could not find the correct Provider<AuthService> above this SignIn Widget

發生這種情況是因為您使用的BuildContext不包括您選擇的提供者。 有幾種常見的場景:

  • 您在main.dart中添加了一個新提供程序並執行了熱重載。 要修復,請執行熱重啟。

  • 您嘗試以不同方式讀取它的提供程序。

    提供者是“范圍的”。 因此,如果您在路由中插入提供程序,那么其他路由將無法訪問該提供程序。

  • 您使用的BuildContext是您嘗試讀取的提供程序的祖先。

    確保 SignIn 在您的 MultiProvider/Provider 下。 這通常發生在您創建提供程序並嘗試立即讀取它時。

    例如,而不是:

     Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // Will throw a ProviderNotFoundError, because `context` is associated // to the widget that is the parent of `Provider<Example>` child: Text(context.watch<Example>()), ), }

    考慮像這樣使用builder

     Widget build(BuildContext context) { return Provider<Example>( create: (_) => Example(), // we use `builder` to obtain a new `BuildContext` that has access to the provider builder: (context) { // No longer throws return Text(context.watch<Example>()), } ), }

    拋出異常時,這是堆棧:

     #0 Provider._inheritedElementOf (package:provider/src/provider.dart:329:7) #1 Provider.of (package:provider/src/provider.dart:281:30) #2 ReadContext.read (package:provider/src/provider.dart:607:21) #3 _SignInState._toggleSignInButton (package:wallet_ui_app/pages/Login/pages/login_page.dart:391:13) #4 _SignInState.build.<anonymous closure> (package:wallet_ui_app/pages/Login/pages/login_page.dart:376:21) #5 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21) #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:193:24) #7 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11) #8 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5) #9 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:267:7) #10 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:157:27) #11 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:444:20) #12 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:420:22) #13 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:278:11) #14 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:374:7) #15 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:338:5) #16 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:296:7) #17 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:279:7) #21 _invoke1 (dart:ui/hooks.dart:185:10) #22 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:293:7) #23 _dispatchPointerDataPacket (dart:ui/hooks.dart:98:31) (elided 3 frames from dart:async) Handler: "onTap" Recognizer: TapGestureRecognizer#0cb65 debugOwner: GestureDetector state: ready won arena finalPosition: Offset(216.1, 537.3) finalLocalPosition: Offset(98.3, 28.9) button: 1 sent tap down

我現在將在我收到錯誤的代碼下方發布:

  void _onSignInButtonPress() {
    _pageController.animateToPage(0,
        duration: const Duration(milliseconds: 500), curve: Curves.decelerate);
  }

 void _toggleSignInButton() {
    print('_toggleSignInButton clicked');
    final String email = loginEmailController.text.trim();
    final String password = loginPasswordController.text.trim();
    context.read<AuthService>().login(
      email,
      password,
    ).whenComplete(() => IfAdminLoggedIn());
  }

Authservices.dart:

 class AuthService {
  final FirebaseAuth _auth;

  AuthService(this._auth);

  Stream<User> get authStateChanges => _auth.idTokenChanges();

  Future<String> login(String email, String password) async {

await _auth.signInWithEmailAndPassword(email: email, password: password);
}

有什么解決辦法嗎?

使用riverpod package 它比提供者更容易,現在更新包提供者已棄用並且有太多關於(未找到提供者)的錯誤

對於所有提供者來說,最簡單的解決方案是將它們包含在您的應用程序的根目錄中,在 MaterialApp 之上。

為了查找和調試與這些提供程序相關的問題,我建議在瀏覽器上使用 dart 開發工具並檢查小部件層次結構並查看您嘗試訪問提供程序的小部件是否屬於層次結構。

我之前遇到過類似的問題,我使用 dart 開發工具解決了這個問題(我很容易發現我添加的提供程序脫離了層次結構並且無法訪問,即小部件之間存在兄弟關系,這是我沒想到的,導致提供者無法訪問)。

希望這也對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM