ValueNotifier有一个ValueListenableBuilder小部件。Stream有一个StreamBuilder小部件。Future有一个FutureBuilder小部件。ChangeNotifier?我尝试使用ValueListenableBuilderwithChangeNotifier但ChangeNotifier没有实现ValueListenable。
我知道我可以使用ChangeNotifierProvider该Provider软件包,但我想知道是否有不需要第三方软件包的解决方案。
我一直在努力理解何时ChangeNotifier优于 Rxdart 的Observable或一般的流。
根据 Flutter 的文档:
一个可以扩展或混合的类,它提供使用 VoidCallback 进行通知的更改通知 API。
ChangeNotifier 针对少量(一两个)侦听器进行了优化。添加和删除侦听器为 O(N),分发通知为 O(N²)(其中 N 是侦听器的数量)。
不过,我不确定 ChangeNotifier 可以提供 Observable 或 Stream 不能提供的功能。
这是一个代码:
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 工作得很好,它存储数据,并且在任何事情发生变化时提供完美的事件。
现在,我的应用程序中有这个场景 ->
用户 1 已登录。现在,当我在同一登录中添加第二个帐户(例如 Gmail - 多帐户)时,提供商会向我返回旧值。
我尝试搜索提供者的重置值,但无法找到与之相关的任何内容。
尝试过但没有成功:
Provider.of<LoginProvider>(context).dispose();在深入研究我的应用程序的功能之前,我试图使我的颤振架构尽可能好。我已经基于 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
我正在将图库文件中的新内容推Route送到带有动画的详细信息文件中Hero。一切都很好,但是当我调用pop()详细信息文件内部以返回图库时,出现错误Provider:
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\nRun 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) 我有一个应用程序类,它返回一个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) 我想在另一个提供程序方法中使用 fetchdata() 并初始化变量。

我是 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) 是否有与 Riverpod 中 Provider 的 ChangeNotifierProvider 小部件等效的小部件?
用例是仅当父小部件为 ChangeNotifierProvider/或在其小部件树中具有 ChangeNotifierProvider 的页面已使用 推送到导航器堆栈时才创建提供程序create。我希望在弹出页面时自动处理提供者,并且 ChangeNotifierProvider 小部件从小部件树中删除,就像在 Provider 中一样。
provider state-management flutter flutter-change-notifier riverpod
为什么我们有时使用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) 在我的 Flutter 项目中,我通常倾向于将 Provider 与 Change Notifier 一起用于依赖注入和状态管理目的,因为我发现它比其他解决方案更直观且更少样板,而且我从来没有遇到过任何问题使用这种方法。但最近,我读了很多有关其他状态管理方法的文章,并且听到很多人说 Change Notifier 基本上是一个糟糕且性能较差的状态管理解决方案,特别是在大型应用程序中。就像我说的,我自己从来没有遇到过 Provider 和 Change Notifier 的任何问题,但我仍然是初级开发人员,所以......无论如何,情况真的是这样吗?如果是这样,那么使用 Provider 和 Change Notifier 到底会出现哪些问题?目前有哪些其他推荐用于 Flutter 的状态管理解决方案?
provider state-management dart flutter flutter-change-notifier
ChangeNotifierProvider(
builder: (context) => AppStateModel()..loadBrands(),
child: MyTestApp(),
)
Run Code Online (Sandbox Code Playgroud)
为什么我们必须这样调用AppStateModel()..loadBrands(),级联在这里如何帮助我们?