此屏幕是一个抽屉屏幕,它采用身份验证块,以便为用户提供信息并使其能够注销。虽然我使用了正确的提供程序,但我收到了这个错误
The following ProviderNotFoundError was thrown building Pets4allDrawer(dirty):
I/flutter (32011): Error: Could not find the correct Provider<AuthService> above this Pets4allDrawer Widget
I/flutter (32011): To fix, please:
I/flutter (32011): * Ensure the Provider<AuthService> is an ancestor to this Pets4allDrawer Widget
I/flutter (32011): * Provide types to Provider<AuthService>
I/flutter (32011): * Provide types to Consumer<AuthService>
I/flutter (32011): * Provide types to Provider.of<AuthService>()
I/flutter (32011): * Ensure the correct `context` is being used.
Run Code Online (Sandbox Code Playgroud)
我想知道为什么使用 Provider.of(context) 不起作用的问题,调用它时找不到它。
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:pets4all/blocs/authBloc.dart';
import …Run Code Online (Sandbox Code Playgroud) 我通过添加 Provider 作为状态管理来重构我的 Flutter 应用程序代码。
期望的行为:当主屏幕打开时,应用程序应检查用户的电子邮件是否已验证,如果未验证,则应显示对话框弹出窗口。
问题:当我通过构造函数为 EmailVerified 传递数据时它工作正常,但是如果我想使用 Provider,我无法在initState()生命周期中获取这些数据。
您能否为我推荐这种用例的正确方法?
import 'package:myapp/services/authentication.dart';
import 'package:myapp/screens/settings_screen.dart';
import 'package:flutter/material.dart';
import 'package:myapp/services/authentication.dart';
import 'package:provider/provider.dart';
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => new _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
bool _isEmailVerified = false;
@override
void initState() {
super.initState();
_checkEmailVerification(); // <=== Method which should show Dialog box if email is not verified which is coming from "Auth" Provider
}
@override
Widget build(BuildContext …Run Code Online (Sandbox Code Playgroud) state-management flutter flutter-layout flutter-provider flutter-state
我在使用 Provider 包通过 SnackBar 显示消息时遇到问题。我得到的错误信息是:
VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer stable.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
#0 Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure> (package:flutter/src/widgets/framework.dart:3508:9)
#1 Element._debugCheckStateIsActiveForAncestorLookup (package:flutter/src/widgets/framework.dart:3522:6)
#2 Element.findAncestorStateOfType (package:flutter/src/widgets/framework.dart:3641:12)
#3 Scaffold.of (package:flutter/src/material/scaffold.dart:1313:42)
#4 LoginScreen.build.<anonymous closure>.<anonymous closure> (package:zvjs_app/screens/login_screen.dart:74:38)
<asynchronous suspension>
#5 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182<…>
Run Code Online (Sandbox Code Playgroud)
Bellow 是我的代码,我认为所有属于所需逻辑的类。我不明白为什么 …
根据我对 flutter 包的理解Provider,它是一种在小部件之间共享对象的方法。我知道另一种方法是创建一个类,例如AppGlobal,并定义static整个应用程序可以使用的各种变量。有人建议这Provider是一种更好的方法,但我不明白为什么会这样。
我的应用程序有两种类型的用户:管理员和普通用户。我向管理员显示管理屏幕,向普通用户显示普通屏幕。所有用户都需要访问Provider model1。但只有 admin 需要 access model2。
我如何只能model2为管理员用户初始化?
例如:
class MyApp extends StatelessWidget {
final model1 = Model1();
final model2 = Model2();
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(builder: (_) => model1),
ChangeNotifierProvider(builder: (_) => model2),
],
child: MaterialApp(
Run Code Online (Sandbox Code Playgroud)
我想提出model2只在AdminScreen。但是,如果我这样做,其他管理页面将无法访问model2,Navigator.push因为它们不是AdminScreen.
感谢帮助!
我在 Flutter 演示中使用Provider来管理状态。
我想为我的小部件设置动画,但似乎 AnimateController 需要一个来自有状态小部件状态的同步参数。
据我所知,不建议 Provider 与有状态小部件一起使用。
我可以使用 Provider 管理 AnimationController 吗?
还是必须同时使用 Provider 和有状态小部件?
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
return false;
},
child: Stack(
children: <Widget>[
DefaultTabController(
length: 5,
child: ChangeNotifierProvider(
builder: (context) => MySchedule(),
child: (
Scaffold(
appBar: AppBar(
actions: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () async{
await Navigator.of(context).push(
MaterialPageRoute(builder: (context){
return InApp();
})
);
final MySchedule schedules = Provider.of<MySchedule>(context);
schedules.numberOfCoins = 10;
},
child: Card(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Consumer<MySchedule>(
builder: (context, coin, _) …Run Code Online (Sandbox Code Playgroud) 我有一个正在侦听playerList类更改的提供程序:
import 'package:flutter/material.dart';
import 'package:scam_artist/constants/PlayerColors.dart';
import 'package:scam_artist/models/Player.dart';
class PlayerList with ChangeNotifier {
List<Player> _players = [];
List<Player> get players {
return [..._players];
}
void addPlayer(Key key, String name, int index) {
_players.add(
new Player(key: key, color: PlayerColors.colors[index], name: name));
notifyListeners();
}
void editPlayerName(String newName, int index) {
_players[index].name = newName;
notifyListeners();
}
void editPlayerColor(Color newColor, int index) {
_players[index].color = newColor;
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我调用函数将值Player更改为对象之一(例如更改名称)时,列表不会使用新数据更新对象。
我需要另一个提供者来Player上课吗?如果是这样,我如何让PlayerList提供者监听提供者的变化Player?
做一些研究,我认为 ProxyProvider 可能是我正在寻找的,但我不确定如何实现它。
Player …
我正在开发一个简单的演示,用户登录,查看项目列表,单击项目,然后查看其详细信息。这是 3 个屏幕,但我们假设有两个流程,其中一个处理登录,另一个处理项目。
我正在使用包管理我的状态provider。我LoginRepository在我的根小部件上放置了一个提供程序,因为到处都需要该状态。这很好用。
现在我需要一个ItemRepository应该在ItemListScreen和 上可用的ItemDetailScreen。为了实现该范围,我决定创建一个名为 的共同祖先小部件ItemScreens。这是我放置提供程序和嵌套 Navigator.
我使用导航器来导航屏幕,Navigator.of(context)以确保使用了关闭的祖先导航器。我使用获取我的提供程序Provider.of<ItemRepository>(context)来确保使用关闭祖先状态。
这显然不起作用,因为我得到了Could not find the correct provider. 我知道来自同级路由的提供程序不能被另一个同级路由访问,但在这里我嵌套导航器,我希望将其ItemRepository放置在ItemScreens其中然后处理子路由,以便这两个路由可以从父路由获取提供程序?
旁注:
Flutter文档明确指出应提升提供程序以实现正确的范围界定。但我从未见过将提供程序提升为非根小部件的示例。如果我们所能做的就是将提供程序放入根小部件中,那么应该明确说明这一点。
编辑:在多个小部件上重新创建提供程序是一种替代方案,但这并不是真正的范围,它只是伪值传递。
编辑:将所有提供程序放在根小部件上MultiProvider并不是一个好主意,因为它创建了全局状态反模式。除非需要,即用户正在访问该流程/屏幕,否则不应创建某些状态。
我正在使用Provider. 我有两个类:class TenderApiData {}它是独立类(不是小部件)。我怎么能写accesstoken来AppState?
class AppState extends ChangeNotifier // putted to ChangeNotifierProvider
{
String _accesstoken; // need to fill not from widget but from stand alone class
String _customer; // Fill from widget
List<String> _regions; // Fill from widget
List<String> _industry; // Fill from widget
...
}
Run Code Online (Sandbox Code Playgroud)
我需要accesstoken从独立类中读/写的方法。
或者我的应用程序架构有问题?
这是完整的源代码。