我在使用 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) 需要了解什么时候应该Bloc模式以及Bloc的生命周期(如何释放持有内存的对象)
我有一个屏幕,我从服务器获取数据,数据将仅用于单个屏幕。我正在使用 Bloc 模式来显示数据。
使用 Bloc 模式时,我有一个正在使用 StatelessWidget 的屏幕。我正在尝试处理“WillPopScope”上的流。一旦被处置,流就不能再使用。因为访问同一屏幕会导致崩溃,因为我用 Bloc 包装了 MaterialApp。
final _leaderBoardList = StreamController<List<dynamic>>.broadcast();
Run Code Online (Sandbox Code Playgroud)
dispose() {
print('_leaderBoardList disposed');
_leaderBoardList.close();
}
Run Code Online (Sandbox Code Playgroud)
LeaderBoardProvider(
child: MaterialApp(
title: 'Table View Fetch',
theme: ThemeData(
primarySwatch: Colors.teal,
),
home: HomeScreen(),
),
);
Run Code Online (Sandbox Code Playgroud)
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 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) 如何在 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) 我不太明白 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) 我一直在尝试创建一个由 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不提供更新索引处数组元素的方法。您必须读取整个文档,修改内存中的数组,然后将整个数组写回文档。
当我尝试访问特定屏幕时,我收到“空值检查运算符”。
我屏蔽了我的“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 的新手,不知道如何解决它。
我正在制作一个在线商店,其中在 mvvm 架构上有折扣部分和产品类别,目标是更改添加到购物车的产品数量,除了所有产品的数量发生变化外,一切正常,但所有内容都会显示在数据库中正确,我确信在某个地方我错过了一些重要的东西,我将不胜感激的答案,我将在下面附上屏幕截图
\n根页
\nreturn 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);\nRun Code Online (Sandbox Code Playgroud)\n … 也许我不明白 BloC 或 Provider 的目的,但我很困惑为什么我们想要使用它们而不是使用 Flutter 的内置状态管理(使用 widget)Stateful。我刚刚完成了一个应用程序,但不记得我希望我需要比默认值更多的东西。有人可以帮我解决问题吗?
我构建了一个工作倒计时时钟,以小时:分钟:秒的格式显示剩余时间。在有状态的小部件内。使用全屏墨水池来启动和停止它。我想要做的就是将此代码传输到更改通知程序。(我已经准备好更改通知程序设置,称为 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) flutter ×10
flutter-provider ×10
dart ×6
firebase ×2
bloc ×1
flutter-bloc ×1
flutter-web ×1
gridle ×1
mvvm ×1