标签: flutter-provider

错误:在此小部件上方找不到正确的提供程序

此屏幕是一个抽屉屏幕,它采用身份验证块,以便为用户提供信息并使其能够注销。虽然我使用了正确的提供程序,但我收到了这个错误

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)

flutter flutter-provider

15
推荐指数
1
解决办法
2万
查看次数

如何在 Flutter 应用程序的 initState 期间使用来自 Provider 的数据

我通过添加 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

15
推荐指数
3
解决办法
1万
查看次数

Flutter - 使用 Provider 包、FireStore 身份验证查找停用的小部件的祖先是不安全的

我在使用 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 是我的代码,我认为所有属于所需逻辑的类。我不明白为什么 …

dart flutter flutter-provider

14
推荐指数
1
解决办法
1万
查看次数

Flutter:为什么 Provider 比只有静态单例的 AppGlobal 类更好?

根据我对 flutter 包的理解Provider,它是一种在小部件之间共享对象的方法。我知道另一种方法是创建一个类,例如AppGlobal,并定义static整个应用程序可以使用的各种变量。有人建议这Provider是一种更好的方法,但我不明白为什么会这样。

dart flutter flutter-provider

13
推荐指数
2
解决办法
2750
查看次数

导航到另一条路线后如何使用 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。但是,如果我这样做,其他管理页面将无法访问model2Navigator.push因为它们不是AdminScreen.

感谢帮助!

dart flutter flutter-provider

12
推荐指数
1
解决办法
6823
查看次数

Flutter:如何使用 Provider 播放动画?

我在 Flutter 演示中使用Provider来管理状态。

我想为我的小部件设置动画,但似乎 AnimateController 需要一个来自有状态小部件状态的同步参数。

据我所知,不建议 Provider 与有状态小部件一起使用。

我可以使用 Provider 管理 AnimationController 吗?

还是必须同时使用 Provider 和有状态小部件?

flutter flutter-animation flutter-provider

12
推荐指数
1
解决办法
3321
查看次数

找不到正确的提供者 - Flutter

  @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)

dart flutter flutter-provider

11
推荐指数
2
解决办法
2万
查看次数

如何使用颤振提供程序侦听列表中的更改?

我有一个正在侦听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 …

flutter flutter-provider

11
推荐指数
1
解决办法
4182
查看次数

如何在多个小部件上确定提供程序的范围,而不将提供程序放在颤振中的根小部件上

我正在开发一个简单的演示,用户登录,查看项目列表,单击项目,然后查看其详细信息。这是 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并不是一个好主意,因为它创建了全局状态反模式。除非需要,即用户正在访问该流程/屏幕,否则不应创建某些状态。

flutter flutter-navigation flutter-provider

11
推荐指数
1
解决办法
1562
查看次数

如何从没有上下文的类访问提供者字段?

我正在使用Provider. 我有两个类:class TenderApiData {}它是独立类(不是小部件)。我怎么能写accesstokenAppState

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从独立类中读/写的方法。

或者我的应用程序架构有问题?

是完整的源代码。

flutter flutter-provider

10
推荐指数
2
解决办法
6717
查看次数