我有一个问题,我想MultiProvider用一些不同的提供程序创建一个,问题是其中两个是 StreamProvider,首先需要进行 Firebase 身份验证登录,然后根据用户的结果订阅 Firebase 中的 Stream登录。
因此,如果我无法StreamProvider在我的MaterialApp.
如果我在登录完成后声明这些提供程序,我会收到一条错误消息,指出提供程序不在正确的路线上,因为我需要所有应用程序周围多个路线中的数据。
这是我的代码:
class Neybor extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textTheme = GoogleFonts.nunito;
return MultiProvider(
providers: [
ChangeNotifierProvider<Data>(create: (context) => new Data()),
/// Settings Stream
StreamProvider<SettingsDataModel>.value(
value: Globals.firebaseCaller.settings(),
),
/// Plans Stream
StreamProvider<PlansDataModel>.value(
value: Globals.firebaseCaller.plans(),
),
],
child: MaterialApp(
...
}
Run Code Online (Sandbox Code Playgroud)
对于Globals.firebaseCaller.settings()并且Globals.firebaseCaller.plans()我使用注册用户uid
有没有办法声明 aStreamProvider并稍后在我的代码中订阅它?
提前致谢
我正在尝试使用 Riverpod 与 Laravel 后端登录。现在我只是从存储库返回 true 或 false。我设置了一个接受电子邮件和密码的表单。isLoading变量只是为了显示一个圆形指示器。我已经运行了代码并且它可以工作,但不确定我是否正确使用了 Riverpod。有更好的方法吗?
auth_provider.dart
class Auth{
final bool isLogin;
Auth(this.isLogin);
}
class AuthNotifier extends StateNotifier<Auth>{
AuthNotifier() : super(Auth(false));
void isLogin(bool data){
state = new Auth(data);
}
}
final authProvider = StateNotifierProvider((ref) => new AuthNotifier());
Run Code Online (Sandbox Code Playgroud)
auth_repository.dart
class AuthRepository{
static String url = "http://10.0.2.2:8000/api/";
final Dio _dio = Dio();
Future<bool> login(data) async {
try {
Response response = await _dio.post(url+'sanctum/token',data:json.encode(data));
return true;
} catch (error) {
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
登录屏幕.dart
void login() …Run Code Online (Sandbox Code Playgroud) 我正在与家人一起使用 Riverpod 的 FutureProvider。FutureProvider 不断地运行。它仅显示加载对话框。热重载也停止工作。FutureProvider 在没有家人的情况下工作得很好。请帮忙找出问题所在。
final ephemerisProvider =
Provider((ref) => ApiService("https://localhost"));
final ephemerisFutureProvider = FutureProvider.family
.autoDispose<EpheModel, Map<String, dynamic>>((ref, data) async {
var response = await ref.read(ephemerisProvider).getData(data);
print(EpheModel.fromJSON(response));
return EpheModel.fromJSON(response);
});
class Kundlis extends ConsumerWidget {
static const routeName = "/kundlis";
@override
Widget build(BuildContext context, ScopedReader watch) {
final AsyncValue<EpheModel> kundlis = watch(ephemerisFutureProvider({}));
return Scaffold(
appBar: AppBar(
title: Text("Kundlis"),
),
drawer: AppDrawer(),
body: kundlis.when(
data: (kundli) => Center(child: Text(kundli.toString())),
loading: () => ProgressDialog(message: "Fetching Details..."),
error: (message, st) =>
CustomSnackBar.buildErrorSnackbar(context, …Run Code Online (Sandbox Code Playgroud) 在我的flutter应用程序中,当我尝试热重载或热重启时,过程完成后,重新加载的屏幕显示一秒钟,然后变成全白
仅显示右上角的调试横幅
控制台中没有错误。它只是说重新启动应用程序...
我需要停止并重新运行应用程序!
为什么 ?
我正在使用自动路线和 River pod、fast_i18n 进行本地化
我什至不知道问题出在哪里以及如何解释?
分享要点中的一些代码
https://gist.github.com/RageshAntony/2288a47a8fdc24af1e570a0c7cb9ed08
其他项目运行没有问题
使用provider,Providers 的作用域位于小部件树中。只有小部件的子Provider级可以访问其模型。
它在 的 doc 中说riverpod:
允许在多个位置轻松访问该状态。提供者完全替代了单例、服务定位器、依赖注入或 InheritedWidgets 等模式。
* 这里的“ Providers”指的是
Provider包的类riverpod。
这个provider包是围绕 s 的简化/包装/API InheritedWidget,所以我想 s 可以实现的功能provider也可以通过 s 实现riverpod。
但我无法找出如何做到这一点。
这是我正在尝试迁移的一个小例子。
class Counter extends ValueNotifier<int> {
Counter(): super(0);
}
class MyWidget extends StatelessWidget {
const MyWidget();
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<Counter>(
create: (_) => Counter();
child: Builder(
builder: (context) {
return Row( …Run Code Online (Sandbox Code Playgroud) 我正在学习颤振。大多数教程使用Providerpackage,但 Youtube 上的其他一些教程使用GetX. 我搜索了一下,发现似乎还有其他软件包,例如Bloc,Riverpod等等。
我很困惑,不知道该用哪一个?它似乎GetX比导航更简单Provider,并且具有更多功能/特性,例如导航,但是使用它的代码/教程并不多!我想知道为什么?另外我应该使用哪一个?
编辑:也许这看起来像是一个基于意见的问题,但在我看来并非如此。我想知道为什么大多数教程/开源代码仍然使用Providerpackage over GetX、Riverpod、Bloc等?
有ProviderFlutter支持的官方包并且使用起来更安全吗?它有更少的错误吗?或者只是因为它是大多数开发人员学会使用的第一个包并且它对他们有用,所以他们不喜欢用更好的包来替换它?
state-management flutter flutter-provider riverpod flutter-getx
所以我在我的小部件树中设置了这个 ChangeNotifierProvider,因为我看到很多子小部件来聆听它的价值。
我目前正在做的是,每当我要在我的子小部件上重用某些值/函数时,我都会通过构造函数将Provider.of(context)对象从父小部件传递给它的子小部件。例如,每次我为我的孩子小部件创建一个Provider.of(context)对象时,它似乎没有继承我在父 Provider 上的更新值,而是这个具有我的默认值 null/0/'empty'像它这样的只是被创造出来的。这导致我将初始Provider.of(context)对象传递给每个将使用 ChangeNotifier 更新值和函数的子级。
这个设置对我有用,但是,当我的小部件树开始变得复杂时,我不断地通过每个小部件向下传递值,甚至将值传递给一些甚至根本不使用它的人,只是为了让它的孩子听主提供者。
我认为我现在可能正在做的是提供者架构的反模式,我希望你们能以更优化和更有效的方式帮助我做到这一点。
非常感谢!
PS 文档中的一些内容我还没有完全掌握。
编辑以下以包含示例代码和可视化:
provider_type.dart
class ProviderType extends ChangeNotifier{
String valueA = '';
String valueB = '';
}
Run Code Online (Sandbox Code Playgroud)
家.dart
import ..provider_type.dart
...
Widget build(BuildContext context){
return ChangeNotifierProvider<ProviderType>(
create: (context) => ProviderType(),
child: ScreenColumn();
);
}
...
Run Code Online (Sandbox Code Playgroud)
screen_column.dart
import ..screen_a.dart
import ..screen_b.dart
class ScreenColumn extends StatelessWidget{
Widget build(BuildContext context){
var providerType = Provider.of<ProviderType>(context);
return Column(
children: <Widget>[
ScreenA(providerType: providerType),
ScreenB(providerType: providerType),
],
);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在使用提供者模式制作一个颤振应用程序。当我启动我的应用程序时,我收到空错误。
button_data.dart是这样的。
class ButtonData extends ChangeNotifier {
List<Button> _buttons = [
Button(
type: "A",
numberone: "1",
numbertwo: "2",
numberthree: "3",
),
Button(
key: "B",
numberone: "A",
numbertwo: "B",
numberthree: "C",
),
];
Button _selectedButton;
List<Button> get buttons => _buttons;
Button get selectedButton => _selectedButton;
void setSelectedItem(Button s) {
_selectedButton = s;
notifyListeners();
}
Button getType(String value) {
return _buttons
.where((button) => button.type == value).first;
} // it is no use...
}
Run Code Online (Sandbox Code Playgroud)
当我切换类型时,我希望这些按钮显示不同。
new Row(children: [
buildButton(Provider.of<ButtonData>(context).getNumberOne(Provider.of<ButtonData>(context).selectedButton.type)),
buildButton(Provider.of<ButtonData>(context).getNumberTwo(Provider.of<ButtonData>(context).selectedButton.type)),
buildButton(Provider.of<ButtonData>(context).getNumberThree(Provider.of<ButtonData>(context).selectedButton.type)),
]) …Run Code Online (Sandbox Code Playgroud) ChangeNotifier我正在从一个方法调用其中一个函数initState(),并且notifyListener()该函数内部的调用抛出
setState() or markNeedsBuild() called during build.异常
void initState(){
Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0);
super.initState();
}
Run Code Online (Sandbox Code Playgroud)
class MessengerRepository with ChangeNotifier {
int unreadCount;
void setUnreadCount(int value){
unreadCount = value;
notifyListeners();
}
Run Code Online (Sandbox Code Playgroud)
我需要调用notifyListener()内部setUnreadCount(),因为我setUnreadCount()在执行过程中在多个地方调用该函数。所以无法删除notifyListener()里面唯一的initState()。
使用provider4.0.4版本
我有两个提供者,一个是 EntriesProvider,另一个是 EntryProvider。我在创建条目时使用我的 EntryProvider 和我的 EntriesProvider 来加载保存到数据库的所有条目。我遇到了一个问题,我认为这可能是我对如何使用 Providers 的理解。一旦我将我的数据库数据加载到我的 EntriesProvider 中,我就会将该数据加载到 ListView 中。单击某个项目后,我将该列表中的条目传递到我的视图中以进行填充和编辑。
我的问题是,当我在不保存的情况下编辑条目时,我可以看到 ListView 中发生的更改,这不是我想要的。我尝试清除 EntryProvider,因为我认为属于它的数据与 EntriesProvider 是分开的。但是现在我在尝试了很多事情之后不知道了。当我只要求 EntryProvider 更新其侦听器时,为什么要更新列表?
class EntryProvider extends ChangeNotifier {
Entry _entry;
BuildContext context;
EntryProvider();
Entry get getEntry {
return _entry;
}
void setEntryContext(Entry entryToBeSet, BuildContext context) {
this._entry = entryToBeSet;
this.context = context;
notifyListeners();
}
void clearEntryContext() {
this._entry = null;
this.context = null;
notifyListeners();
}
void addImageToEntry(String imagePath) {
getEntry.images.add(imagePath);
notifyListeners();
}
void removeImageAt(int index) { …Run Code Online (Sandbox Code Playgroud)