标签: flutter-change-notifier

Flutter 中 ChangeNotifier 的构建器小部件

背景

  • AValueNotifier有一个ValueListenableBuilder小部件。
  • AStream有一个StreamBuilder小部件。
  • AFuture有一个FutureBuilder小部件。

问题

  • 建造者是做什么用的ChangeNotifier

我尝试过的

我尝试使用ValueListenableBuilderwithChangeNotifierChangeNotifier没有实现ValueListenable

我知道我可以使用ChangeNotifierProviderProvider软件包,但我想知道是否有不需要第三方软件包的解决方案。

dart flutter flutter-change-notifier

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

在 Flutter 中,ChangeNotifier 何时优先于 Observable?

我一直在努力理解何时ChangeNotifier优于 Rxdart 的Observable或一般的流。

根据 Flutter 的文档:

一个可以扩展或混合的类,它提供使用 VoidCallback 进行通知的更改通知 API。

ChangeNotifier 针对少量(一两个)侦听器进行了优化。添加和删​​除侦听器为 O(N),分发通知为 O(N²)(其中 N 是侦听器的数量)。

不过,我不确定 ChangeNotifier 可以提供 Observable 或 Stream 不能提供的功能。

dart flutter rxdart flutter-change-notifier

8
推荐指数
1
解决办法
985
查看次数

Flutter 中的参数类型 'Widget Function(BuildContext)' 无法分配给参数类型 'Widget Function(BuildContext, Widget)' 错误

这是一个代码:

import 'package:flutter/material.dart';
import 'package:flutterapp/ui/pages/notes_home.dart';
import 'package:provider/provider.dart';
import 'package:flutterapp/ui/pages/splash.dart';
import 'package:flutterapp/ui/pages/user_info.dart';
import 'package:flutterapp/ui/pages/auth/login.dart';
import 'package:flutterapp/model/user_repository.dart';
import 'package:path/path.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      builder: (_) => UserRepository.instance(),
      child: Consumer
        // ignore: missing_return
        (builder: (context, UserRepository user, _) {
          // ignore: missing_return
          switch (user.status){
            case Status.Uninitialized:
              return Splash();
            case Status.Unauthenticated:
            case Status.Authenticating:
              return LoginPage();
            case Status.Authenticated:
              return NotesHomePage();
          }
      }),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

上面代码中的“builder: (_) => UserRepository.instance(),”行显示了一个错误

参数类型 'Widget Function(BuildContext)' 不能分配给参数类型 'Widget Function(BuildContext, Widget)'

每当我运行程序时,它都会显示 …

provider android flutter flutter-change-notifier

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

重置提供商数据 - Flutter

我在我的应用程序中使用多提供商。Provider 工作得很好,它存储数据,并且在任何事情发生变化时提供完美的事件。

现在,我的应用程序中有这个场景 ->

用户 1 已登录。现在,当我在同一登录中添加第二个帐户(例如 Gmail - 多帐户)时,提供商会向我返回旧值。

我尝试搜索提供者的重置值,但无法找到与之相关的任何内容。

尝试过但没有成功:

  • 创建了要重置的新提供者对象。
  • Provider.of<LoginProvider>(context).dispose();

provider flutter flutter-change-notifier

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

使用 Firebase Auth 和 ChangeNotifierProvider 进行 Flutter 路由

在深入研究我的应用程序的功能之前,我试图使我的颤振架构尽可能好。我已经基于 ChangeNotifierProvider 制作了一个带有 firebase 身份验证的应用程序:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.lightBlue,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      builder: (_) => AuthentService.instance(),
      child: Consumer(builder: (context, AuthentService authentService, _) {
        switch (authentService.status) {
          case Status.Authenticated:
            return DashboardScreen();
          default:
            return LoginScreen();
        }
      }),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

此 Home 小部件正在侦听身份验证状态,并在登录或未登录时返回任何 …

routing android firebase-authentication flutter flutter-change-notifier

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

使用 Hero 动画 Flutter 找不到正确的 Provider&lt;&gt;

我正在将图库文件中的新内容推Route送到带有动画的详细信息文件中Hero。一切都很好,但是当我调用pop()详细信息文件内部以返回图库时,出现错误Provider

\n
flutter: \xe2\x95\x90\xe2\x95\x90\xe2\x95\xa1 EXCEPTION CAUGHT BY WIDGETS LIBRARY \xe2\x95\x9e\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\nflutter: The following ProviderNotFoundException was thrown building GalleryThumbnail(dirty, state:\nflutter: _GalleryThumbnailState#9dc96):\nflutter: Error: Could not find the correct Provider<GalleryViewModel> above this GalleryThumbnail Widget\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的画廊文件:

\n
@override\n  Widget build(BuildContext context) {\n    return MultiProvider(\n        providers: [\n          ChangeNotifierProvider.value(value: galleryViewModel),\n          ChangeNotifierProvider.value(value: galleryProvider)\n        ],\n        child: Scaffold(\n            resizeToAvoidBottomInset: false,\n            body: Stack(\n              children: [\n                Consumer<GalleryViewModel>(\n                    builder: (context, model, child) =>\n                        galleryViewModel.assetsList.length != 0 ? gallery() : emptyGallery()),\n\n...\n\n}\n\n\nWidget gallery() {\n    return Container(\n …
Run Code Online (Sandbox Code Playgroud)

provider navigator dart flutter flutter-change-notifier

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

当我渲染我的子材质应用程序时,如何阻止我的更改通知程序提供程序重建我的父材质应用程序?

我有一个应用程序类,它返回一个MaterialApp()它的主页设置为TheSplashPage(). 如果任何首选项发生更改,此应用程序会侦听首选项通知程序。

然后TheSplashPage()我等待一些条件为真,如果是的话,我会向他们展示我的嵌套材料应用程序。

旁注:我在这里使用材料应用程序,因为它看起来更合乎逻辑,因为它具有父材料应用程序不应该具有的路由。而且一旦用户未经身份验证或断开连接,我希望整个嵌套应用程序关闭并显示另一个页面。这很好用!

但我的问题如下。ThePreferencesProvider()当主题更改时,这两个应用程序都会收听,因此它们都会收到通知并重新构建。但这是一个问题,因为每当父材质应用程序重建时,它都会返回启动页面。所以现在TheSplashPage()每当我更改TheSettingsPage().

所以我的问题是如何阻止我的应用程序TheSplashPage()在我更改设置时返回到?

Main.dart

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

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIOverlays([]);

    return MultiProvider(
      providers: [
        ChangeNotifierProvider<PreferencesProvider>(create: (_) => PreferencesProvider()),
        ChangeNotifierProvider<ConnectionProvider>(
          create: (_) => ConnectionProvider(),
        ),
        ChangeNotifierProvider<AuthenticationProvider>(create: (_) => AuthenticationProvider()),
      ],
      child: Consumer<PreferencesProvider>(builder: (context, preferences, _) {
        return MaterialApp(
          home: TheSplashPage(),
          theme: preferences.isDarkMode ? DarkTheme.themeData : LightTheme.themeData,
          debugShowCheckedModeBanner: false,
        );
      }),
    );
  }
} …
Run Code Online (Sandbox Code Playgroud)

dart flutter flutter-change-notifier

3
推荐指数
2
解决办法
2355
查看次数

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

ChangeNotifier 被处理后被使用

我是 Flutter 新手,并且坚持这个问题,我有一个页面使用名为 GoogleMapsNotifier 和 ChangeNotifier 的类,当我弹出页面时,我想在该类中处理 Stream(最后一个函数)。

class GoogleMapsNotifier with ChangeNotifier {
  final geolocatorService = GeolocatorService();
  final placesService = PlacesService();
  final markerService = MarkerService();

  Position? currentLocation;
  List<PlaceSearch> searchResults = [];
  StreamController<Place> selectedLocation = BehaviorSubject<Place>();
  StreamController<LatLngBounds> bounds = BehaviorSubject<LatLngBounds>();
  late Place selectedLocationStatic;
  List<Marker> markers = <Marker>[];

  GoogleMapsNotifier() {
    setCurrentLocation();
  }

  setCurrentLocation() async {
    currentLocation = await geolocatorService.determinePosition();
    selectedLocationStatic = Place(
        geometry: Geometry(
          location: Location(
              lat: currentLocation!.latitude, lng: currentLocation!.longitude),
        ),
        name: '',
        vicinity: '');
    notifyListeners();
  }

  searchPlaces(String searchTerm) async {
    searchResults …
Run Code Online (Sandbox Code Playgroud)

flutter flutter-provider flutter-change-notifier

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

相当于 Riverpod 中的 ChangeNotifierProvider 小部件

是否有与 Riverpod 中 Provider 的 ChangeNotifierProvider 小部件等效的小部件?

用例是仅当父小部件为 ChangeNotifierProvider/或在其小部件树中具有 ChangeNotifierProvider 的页面已使用 推送到导航器堆栈时才创建提供程序create。我希望在弹出页面时自动处理提供者,并且 ChangeNotifierProvider 小部件从小部件树中删除,就像在 Provider 中一样。

provider state-management flutter flutter-change-notifier riverpod

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

当我们在 ChangeNotifier 中使用 notifyListeners 时?

为什么我们有时使用notifyListeners 以及为什么我们不使用notifyListeners?我们如何在 changenotifier 中使用函数?

例如,在这段代码中,有时我们使用了notifyListeners,但有时我们没有使用notifyListeners(在login() 函数中)。为什么 ?当我们使用notifyListeners 时?

String get userEmail => _userEmail;

  set userEmail(String value) {
    _userEmail = value;
    notifyListeners();
  }

  String get userPassword => _userPassword;

  set userPassword(String value) {
    _userPassword = value;
    notifyListeners();
  }

  String get userName => _userName;

  set userName(String value) {
    _userName = value;
    notifyListeners();
  }

  DateTime get dateOfBirth => _dateOfBirth;

  set dateOfBirth(DateTime value) {
    _dateOfBirth = value;
    notifyListeners();
  }

  Future<bool> login() async {
    try {
      isLoading = true;

      print(userEmail);
      print(userPassword);

      if (isLogin) {
        await FirebaseAuth.instance.signInWithEmailAndPassword( …
Run Code Online (Sandbox Code Playgroud)

state-management dart flutter flutter-change-notifier

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

对于 Flutter 来说,带有 Provider/Scoped Model 的 Change Notifier 是一个糟糕的状态管理解决方案吗?

在我的 Flutter 项目中,我通常倾向于将 Provider 与 Change Notifier 一起用于依赖注入和状态管理目的,因为我发现它比其他解决方案更直观且更少样板,而且我从来没有遇到过任何问题使用这种方法。但最近,我读了很多有关其他状态管理方法的文章,并且听到很多人说 Change Notifier 基本上是一个糟糕且性能较差的状态管理解决方案,特别是在大型应用程序中。就像我说的,我自己从来没有遇到过 Provider 和 Change Notifier 的任何问题,但我仍然是初级开发人员,所以......无论如何,情况真的是这样吗?如果是这样,那么使用 Provider 和 Change Notifier 到底会出现哪些问题?目前有哪些其他推荐用于 Flutter 的状态管理解决方案?

provider state-management dart flutter flutter-change-notifier

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

在 ChangeNotifierProvider 中使用双点 (..) 运算符/级联

ChangeNotifierProvider(
  builder: (context) => AppStateModel()..loadBrands(),
  child: MyTestApp(),
)
Run Code Online (Sandbox Code Playgroud)

为什么我们必须这样调用AppStateModel()..loadBrands(),级联在这里如何帮助我们?

cascading dart flutter flutter-change-notifier

0
推荐指数
1
解决办法
2199
查看次数