我有一个sqlite从中读取数据的数据库。我也有一个很长的小部件树。所以经过一番研究,我找到了providerFlutter 包。但是我不知道如何在扩展类中使用 FuturesChangeNotifier或如何在我的小部件树中的任何地方使用它?
class MyProvider with ChangeNotifier {
dynamic _myValue;
dynamic get myValue => _myValue;
set myValue(dynamic newValue) {
_myValue = newValue;
notifyListeners();
}
MyProvider(){
loadValue();
}
Future<void> loadValue async {
myValue = await db.instance().getValue();
}
Future<void> refetch async {
myValue = await db.instance().newValue();
notifyListeners();
}
}
Run Code Online (Sandbox Code Playgroud) 更多地了解Provider和ChangeNotifier架构,我觉得很类似于老好MVVM架构,其中一个Widget是查看并获取所通知的更改ViewModel,这是ChangeNotifier由联Consumer和Provider。
为什么不将其称为Flutter的MVVM?这两种架构之间有什么实际区别?
我有Model要执行的代码。我公司提供Model有Provider。但是如果Model在完成执行之前处理我得到错误:
E/flutter (26180): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] 未处理的异常:模型被处理后使用。E/flutter (26180):一旦你在模型上调用了 dispose(),它就不能再使用了。
例如Model,如果用户按后退按钮则处理Navigator.pop()。这是因为Model仅适用于此 Widget。
但这意味着我无法在Model?
我的代码:
class Model extends ChangeNotifier {
bool error = false;
func() {
try {
await execute();
error = false
} catch {
error = true;
print(e.toString());
}
}
}
class ExampleWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => Model(),
child: Consumer<Model>(builder: (context, model, _) {
return FloatingActionButton(
child: …Run Code Online (Sandbox Code Playgroud) 我正在 Flutter 中构建我的第一个大型应用程序,也是我需要状态管理的第一个应用程序,所以我转向了 Provider,这是用于状态管理的推荐包。但是,我在 main.dart 文件和树下声明我的提供者时遇到了一些问题,我想进行更改并与其中一个提供者进行交互,但无论我尝试什么解决方案,我都会遇到相同的错误:“已尝试从窗口小部件树外部收听提供者公开的值。”。即使根据颤振检查器,我尝试对提供程序进行更改的小部件位于小部件树内部(“主屏幕”屏幕来自我更新提供程序的位置),我也会收到此错误。

下面我也分享我的代码:main.dart:
import 'package:flutter/material.dart';
import 'package:tic_tac_2/screens/welcome_screen.dart';
import 'package:provider/provider.dart';
import 'package:tic_tac_2/models/restaurants_data.dart';
import 'package:tic_tac_2/models/promotions_data.dart';
import 'package:tic_tac_2/models/user.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<User>(create: (context) => User(),),
ChangeNotifierProvider<RestaurantsData>(create: (context) => RestaurantsData(),),
ChangeNotifierProvider<PromotionsData>(create: (context) => PromotionsData(),),
],
child: MaterialApp(
title: 'Tic Tac',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: WelcomeScreen(),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
欢迎_screen.dart:
import 'package:flutter/material.dart';
import 'package:animated_text_kit/animated_text_kit.dart'; …Run Code Online (Sandbox Code Playgroud) 我是新手,目前正在研究 DI。
我正在使用flutter_bloc和provider包装。
flutter_bloc附带一RepositoryProvider,问题IM问自己现在是什么之探源来Provider从provider?
RepositoryProvider存储库有什么特别之处还是只是一种命名策略?
我已经使用提供程序来更改主题,这是浅色和深色主题的代码。我的问题的主要目的是通过开关而不是按钮来更改主题。可以使用“int 模式”正确地通过按钮更改主题。但是当我因为开关而使用“布尔模式”时。该开关需要 true 或 false 值。
如何实现这个开关来改变明暗主题?我需要一个开关,而不是按钮。
import 'package:flutter/material.dart';
class AppStyleModeNotifier extends ChangeNotifier {
bool mode = true; //0 for light and 1 for dark
Color primaryBackgroundColor = Colors.white;
Color appBarBackgroundColor = Colors.cyan[200];
Color boxColor = Colors.blue[50];
Color boxTextColor = Colors.indigo;
Color primaryTextColor = Colors.white;
Color dashboardColor = Colors.cyan;
Color dashboardTextColor = Colors.red[600];
Color dashboardIconColor = Colors.yellow[200];
//Color typeMessageBoxColor = Colors.grey[200];
switchMode() {
if (mode == true) {
//if it is light mode currently switch to dark
primaryBackgroundColor = Colors.grey[900]; …Run Code Online (Sandbox Code Playgroud) flutter flutter-layout flutter-animation flutter-provider flutter-theme
使用Provider和FutureBuilder,我刚刚从数据库中删除了数据,同时它也被删除了,它显示一个红色的屏幕,状态不好,没有元素。添加数据没有问题,不显示这个问题。代码如下
堆栈跟踪
ter (12519): ??? EXCEPTION CAUGHT BY WIDGETS LIBRARY ????????????????????????????????????????????????????????????
I/flutter (12519): The following StateError was thrown building ViewNoteScreen(dirty, dependencies:
I/flutter (12519): [_ModalScopeStatus], state: _ViewNoteScreenState#f589b):
I/flutter (12519): Bad state: No element
I/flutter (12519):
I/flutter (12519): The relevant error-causing widget was:
I/flutter (12519): ViewNoteScreen file:///C:/Users/Admin/Desktop/daily%2010/provider_note/lib/main.dart:21:46
I/flutter (12519):
I/flutter (12519): When the exception was thrown, this was the stack:
I/flutter (12519): #0 ListMixin.firstWhere (dart:collection/list.dart:148:5)
I/flutter (12519): #1 Providers.findById (package:provider_note/helper/provider.dart:14:19)
I/flutter (12519): #2 _ViewNoteScreenState.build (package:provider_note/screens/view_note.dart:21:35)
I/flutter (12519): #3 StatefulElement.build (package:flutter/src/widgets/framework.dart:4663:28)
I/flutter (12519): …Run Code Online (Sandbox Code Playgroud) 我正在尝试访问 dispose 函数中的提供者方法。
@override
void dispose() {
if (canRemoveData) Provider.of<MyProvider>(context, listen: false).clearData();
super.dispose();
}
Run Code Online (Sandbox Code Playgroud)
但是当它被调用时我收到错误:
在完成小部件树时抛出以下断言:查找已停用小部件的祖先是不安全的。
此时小部件的元素树的状态不再稳定。
我做错了什么以及如何解决它?
我有一个DefaultTabController,我有一个方法可以返回页面List<PreferredSizeWidget>的AppBar's 。我希望他们在 a 中观看状态ChangeNotifier,因此我想将它们包装在 a 中Consumer。当我尝试这样做时,我收到如下错误:
“不能将参数类型 'Widget' 分配给参数类型 'PreferredSizeWidget'。”
我怎样才能解决这个问题?
感谢致敬。
由于代码太大,我会尝试用文字总结一下。
这是最新的异常:
Error: Could not find the correct Provider<ProdEntriesSearchCubit> above this BlocListener<ProdEntriesSearchCubit, ProdEntriesSearchState> Widget
This likely happens because you used a `BuildContext` that does not include the provider
of your choice. There are a few common scenarios:
- The provider you are trying to read is in a different route.
Providers are "scoped". So if you insert of provider inside a route, then
other routes will not be able to access that provider.
- You used a `BuildContext` that is …Run Code Online (Sandbox Code Playgroud)