标签: flutter-provider

无法在此小部件上方找到正确的提供者

我在使用 Flutter Provider 时遇到了问题......我的流程是这样的:登录用户 ID 被传递给新的小部件后 -> 从那里执行保存到数据库,然后重定向到新的小部件(仪表板)。

这是登录后小部件的代码:

return MaterialApp(
      title: title,
      home: Scaffold(
          appBar: AppBar(
            title: Text(title),
          ),
          body: ListView(
            children: <Widget>[
              Container(
                margin: EdgeInsets.all(8.0),
                child: Card(
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.all(Radius.circular(8.0))),
                  child: InkWell(
                    onTap: () {
                      var user = Provider.of<UserRepository>(context);
                      user.savePreference(user.user.id, "Something");
                      user.navigateToNewPage(Dashboard(), context);
                      print(user.user.id);
                    },
Run Code Online (Sandbox Code Playgroud)

这有效:

user.savePreference(user.user.id, "Something");
Run Code Online (Sandbox Code Playgroud)

但这导致了一个问题:

user.navigateToNewPage(Dashboard(), context);
Run Code Online (Sandbox Code Playgroud)

在仪表板小部件中,我正在创建:

 Widget build(BuildContext context) {
    var user = Provider.of<UserRepository>(context);
Run Code Online (Sandbox Code Playgroud)

在 UserRepository 我有这个:

class UserRepository with ChangeNotifier {
  User user;
  Status _status = Status.Uninitialized;

  Status get status …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-provider

6
推荐指数
4
解决办法
3万
查看次数

Flutter-了解 Provider、Bloc 的生命周期以及何时处置流

需要了解什么时候应该Bloc模式以及Bloc的生命周期(如何释放持有内存的对象)

我有一个屏幕,我从服务器获取数据,数据将仅用于单个屏幕。我正在使用 Bloc 模式来显示数据。

使用 Bloc 模式时,我有一个正在使用 StatelessWidget 的屏幕。我正在尝试处理“WillPopScope”上的流。一旦被处置,流就不能再使用。因为访问同一屏幕会导致崩溃,因为我用 Bloc 包装了 MaterialApp。

  1. 创建了一个流
    final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
Run Code Online (Sandbox Code Playgroud)
  1. 处理流
    dispose() {
      print('_leaderBoardList disposed');
      _leaderBoardList.close();
    }
Run Code Online (Sandbox Code Playgroud)
  1. 将 Material App 包装在提供程序中:
    LeaderBoardProvider(
        child: MaterialApp(
        title: 'Table View Fetch',
        theme: ThemeData(
          primarySwatch: Colors.teal,
        ),
        home: HomeScreen(),
      ),
      );
Run Code Online (Sandbox Code Playgroud)
  1. Statelesswidget 'WillPopScope',我已评论了处理代码,因为据我了解,当前块已创建一次:
  Widget build(BuildContext context) {

    print(' ListView fetch Build called');
    final bloc = LeaderBoardProvider.of(context);
    bloc.fetchLeaderBoards();
    return WillPopScope(
      onWillPop: () async {
        //bloc.dispose();
        return true;
      },
      child: bodyStack(context, bloc),
    );
  }
Run Code Online (Sandbox Code Playgroud)

第一个问题,假设我创建一个广播流并删除“WillPopScope”中的代码处理,那么一切都会按预期工作,但我认为,这样,我的 Bloc 就可以为应用程序生命周期保留内存。

第二个问题 …

flutter inherited-widget bloc flutter-provider

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

将提供程序包添加到Flutter Web项目时出错

我尝试将提供程序包添加到我的Flutter Web项目中,并收到以下错误:

由于提供程序的每个版本都依赖于sdk中任何禁止的内容,因此>禁止提供程序。因此,由于WebApplication依赖于提供程序^ 3.0.0,因此版本解析>失败。

Flutter用户应运行flutter packages get而不是pub get。流程结束,退出码为69

我尝试了一下flutter packages get,还将flutter升级到了最新版本。运行flutter packages get时未显示错误,但当我尝试webdev serve以下错误时显示:

webdev无法为此项目运行。在>“ C:\ AppData \ Roaming \ Pub \ Cache \ hosted \ pub.dartlang.org \ provider-3.0.0”中找不到名为“ pubspec.yaml”的文件。

我也看了广告https://github.com/flutter/flutter/issues/21338但没有解决我的错误。

我正在使用Flutter(在Microsoft Windows [Version 10.0.17134.765](区域设置为DE-DE上,Channel beta,v1.6.3))

environment:
  sdk: '>=2.3.0-dev.0.1 <3.0.0'

dependencies:
  flutter_web: any
  flutter_web_ui: any
  provider: ^3.0.0

dev_dependencies:
  build_runner: ^1.4.0
  build_web_compilers: ^2.0.0
  pedantic: ^1.0.0
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-web flutter-provider

5
推荐指数
1
解决办法
814
查看次数

如何在onGenerateRoute中使用provider?

如何在 onGenerateRoute 中使用我的 UserProvider?我想检查用户是否是使用 UserProvider.isLogged() 的记录器,但是当我尝试获取 Userprovider 时,我必须传递路由器中没有的上下文。

我已经尝试将generateRoute更改为非静态并通过构造函数将上下文传递给路由器,但它会抛出错误。

主程序.dart

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    return MultiProvider(
      providers: <SingleChildCloneableWidget>[
        ChangeNotifierProvider(builder: (_) => BottomNavigationBarProvider()),
        ChangeNotifierProvider(builder: (_) => UserProvider()),
      ],
      child: MaterialApp(
      initialRoute: '/',
      onGenerateRoute: Router.generateRoute,
      title: 'Title,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    ),);

}
}
Run Code Online (Sandbox Code Playgroud)

路由器.dart

class Router {

  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case '/':
        return MaterialPageRoute(builder: (_) => HomePage());
        break;
      case '/login':
        return MaterialPageRoute(builder: (_) => LoginPage()); …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-provider

5
推荐指数
1
解决办法
2179
查看次数

ChangeNotifierProvider 中 Consumer / Provider.of 的差异

我不太明白 Provider.of() 和 Consumer 之间的区别。我在这里读到Consumer 就像 Provider.of 一样,带有listen: true。

但是,在下面的示例中,当我使用 Consumer 时我没有收到错误,但在使用 Provider.of 时却收到错误。我被迫使用listen: false。下面的示例是实现了 ChangeNotifierProvider 的默认 flutter 应用程序。

我只需更改 main.dart 中的 floatActionButton 中的代码即可查看 Consumer、Provider.of Listen: true 和 Provider.of Listen: false 之间的差异

counter.dart代码

import 'package:flutter/material.dart';

class Counter extends ChangeNotifier {
  int value = 0;

  void increment() {
    value++;
    notifyListeners();
  }

  void decrement() {
    value--;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

main.dart 的完整代码,其中包含使用 Consumer 的浮动操作按钮。这是工作

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:unit_test/counter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-provider

5
推荐指数
1
解决办法
2572
查看次数

更新 Firestore 中数组的映射数据 - Flutter

我一直在尝试创建一个由 Google Firebase 提供支持的演示“Schedule-App”,但在使用 Firestore 一侧的映射值更新数组的特定值时遇到一些困难。

如下图所示,我们想要实现的onButtonPress,要更新这个特定值。

在此输入图像描述

我创建了一个数据流并通过StreamProvider.

StreamProvider<DocumentSnapshot>.value(
        value: FirebaseFirestore.instance.collection('schedule').doc(FirebaseAuth.instance.currentUser.uid).snapshots(),
Run Code Online (Sandbox Code Playgroud)

我使用以下方法来更新数组的数据,但它不起作用。

  Future<void> updateUserData(int index, String title, String text, int hour, bool check) async {
    DocumentReference snapshots = FirebaseFirestore.instance.collection('schedule').doc(FirebaseAuth.instance.currentUser.uid);
    snapshots.update({
      ['standard_schedule'][index]: {'title': title, 'text': text, 'hour': hour, 'check': check}
    });
  }
Run Code Online (Sandbox Code Playgroud)

我应该对上面的方法进行哪些更改,以便每次按下按钮时更新 bool 值?

=================================================

解决方案(2020 年 10 月 24 日):Firestore不提供更新索引处数组元素的方法。您必须读取整个文档,修改内存中的数组,然后将整个数组写回文档。

firebase flutter google-cloud-firestore flutter-provider

5
推荐指数
1
解决办法
2784
查看次数

由于提供程序类而对空值使用空检查运算符

当我尝试访问特定屏幕时,我收到“空值检查运算符”。

我屏蔽了我的“user_provider”自定义类以及使用它的部分代码,它正常显示(没有红屏),但没有这些屏幕。

这是自定义类

import 'package:flutter/widgets.dart';
import 'package:purple/models/user.dart';
import 'package:purple/resources/auth_methods.dart';

class UserProvider with ChangeNotifier {
  User? _user;
  final AuthMethods _authMethods = AuthMethods();

  User get getUser => _user!;

  Future<void> refreshUser() async {
    User user = await _authMethods.getUserDetails();
    _user = user;
    notifyListeners();
  }
}
Run Code Online (Sandbox Code Playgroud)

我理解这可能是由于第 9 行中的 bang 运算符造成的,但我是 fluttr 的新手,不知道如何解决它。

state-management dart firebase flutter flutter-provider

5
推荐指数
1
解决办法
734
查看次数

带有 GridView Builder 的提供者

我正在制作一个在线商店,其中在 mvvm 架构上有折扣部分和产品类别,目标是更改添加到购物车的产品数量,除了所有产品的数量发生变化外,一切正常,但所有内容都会显示在数据库中正确,我确信在某个地方我错过了一些重要的东西,我将不胜感激的答案,我将在下面附上屏幕截图

\n

根页

\n
return MultiProvider(\n    providers: [\n      ChangeNotifierProvider(\n        create: (context) => MainPageListViewModel(),\n      ),\n      ChangeNotifierProvider(\n          create: (context) => CartViewModel(),\n          child: CartPage()\n      ),\n      ChangeNotifierProvider(\n        create: (context) => AllGoodsViewModel(),\n      ),\n    ],\n  child: MaterialApp(\n      initialRoute: \'/\',\n      routes: {\n        \'/ProfilePage\': (context) => ProfilePage(),\n        \'/MainPage\': (context) => MainPage(),\n        \'/CartPage\': (context) =>   CartPage(),\n      },\n      builder: (context, widget) {\n        return ScreenUtilInitService(\n            builder: (context) => widget!\n        );\n      },\n      title: \'Flutter Demo\',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: present != null ? present : MainPage()\n  ),\n);\n
Run Code Online (Sandbox Code Playgroud)\n …

mvvm dart flutter gridle flutter-provider

5
推荐指数
1
解决办法
793
查看次数

当我们已经有了 Flutter 内置的 setState 时,为什么还要在 Flutter 中使用 BloC 或 Provider 呢?

也许我不明白 BloC 或 Provider 的目的,但我很困惑为什么我们想要使用它们而不是使用 Flutter 的内置状态管理(使用 widget)Stateful。我刚刚完成了一个应用程序,但不记得我希望我需要比默认值更多的东西。有人可以帮我解决问题吗?

flutter flutter-provider flutter-bloc flutter-state

5
推荐指数
1
解决办法
4436
查看次数

在提供程序包更改通知程序内构建倒计时时钟

我构建了一个工作倒计时时钟,以小时:分钟:秒的格式显示剩余时间。在有状态的小部件内。使用全屏墨水池来启动和停止它。我想要做的就是将此代码传输到更改通知程序。(我已经准备好更改通知程序设置,称为 CountdownTimers),因此我可以看到从我的应用程序上的多个页面运行的倒计时。

以下是有状态小部件中工作倒计时时钟的代码:

class ChessClock2 extends StatefulWidget {
  const ChessClock2({Key? key}) : super(key: key);

  @override
  State<ChessClock2> createState() => _ChessClock2State();
}

class _ChessClock2State extends State<ChessClock2> {
  static const countdownDuration = Duration(hours: 5, minutes: 10, seconds: 10);
  Duration duration = Duration();
  Timer? timer;

  bool beenPressed = false;

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

  void Reset() {
    setState(() => duration = countdownDuration);
  }

  void AddTime() {
    final minusSeconds = -1;
    setState(() {
      final seconds = duration.inSeconds + minusSeconds;
      if (seconds < 0) …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-provider

5
推荐指数
1
解决办法
823
查看次数