我注意到我的项目中出现了新的 lint 问题。
长话短说:
我需要在我的自定义类中使用 BuildContext
flutter lint 工具与 aysnc 方法一起使用时并不满意。
例子:
MyCustomClass{
final buildContext context;
const MyCustomClass({required this.context});
myAsyncMethod() async {
await someFuture();
# if (!mounted) return; << has no effect even if i pass state to constructor
Navigator.of(context).pop(); # << example
}
}
Run Code Online (Sandbox Code Playgroud) dart flutter flutter-dependencies flutter-state flutter-build
我通过添加 Provider 作为状态管理来重构我的 Flutter 应用程序代码。
期望的行为:当主屏幕打开时,应用程序应检查用户的电子邮件是否已验证,如果未验证,则应显示对话框弹出窗口。
问题:当我通过构造函数为 EmailVerified 传递数据时它工作正常,但是如果我想使用 Provider,我无法在initState()生命周期中获取这些数据。
您能否为我推荐这种用例的正确方法?
import 'package:myapp/services/authentication.dart';
import 'package:myapp/screens/settings_screen.dart';
import 'package:flutter/material.dart';
import 'package:myapp/services/authentication.dart';
import 'package:provider/provider.dart';
class HomeScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => new _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final GlobalKey<FormState> formKey = GlobalKey<FormState>();
bool _isEmailVerified = false;
@override
void initState() {
super.initState();
_checkEmailVerification(); // <=== Method which should show Dialog box if email is not verified which is coming from "Auth" Provider
}
@override
Widget build(BuildContext …Run Code Online (Sandbox Code Playgroud) state-management flutter flutter-layout flutter-provider flutter-state
在以下情况下,Flutter 重建/重绘如何工作:
每次有状态小部件状态发生变化时,有状态小部件内的无状态小部件是否都会渲染?
有状态小部件可以在无状态小部件内更改吗?它如何影响无状态小部件?
valueNotifier、changeNotifier、stateNotifier 之间有什么区别?
Flutter Navigator 2.0 的主要机制之一是 RouterDelegate > build > Navigator 中的 onPopPage 函数。但是,我不明白 route.didPop(result) 何时返回 false。
我们可以使用John Ryan 的著名例子来说明我的问题。他的演示代码。
onPopPage: (route, result) {
if (!route.didPop(result)) {
return false;
}
// Update the list of pages by setting _selectedBook to null
_selectedBook = null;
show404 = false;
notifyListeners();
return true;
},
Run Code Online (Sandbox Code Playgroud)
在我所有的测试中,使用 AppBar 自动生成的后退按钮,route.didPop(result) 返回 true。
文档保持不变:
bool didPop(dynamic result)
package:flutter/src/widgets/navigator.dart
A request was made to pop this route. If the route can handle it internally (e.g. because …Run Code Online (Sandbox Code Playgroud) 所以,我在Cubit类中做了一个函数,它是从API获取数据。现在,如果我按下按钮,我就可以获得数据。我想让该函数在页面/屏幕打开时自动调用。供您参考,此页面是用户打开应用程序时将启动的第一个页面。这是我的一些代码。
class UsersCubit extends Cubit<UsersState> {
UsersCubit() : super(UsersInitial());
UserRepository _userRepository = UserRepository();
void getAllUsers() async{
emit(UsersLoading());
try{
ResponseUsers _data = await _userRepository.getUsers();
emit(UsersSuccess(_data));
} catch(e){
emit(UsersError(e.toString()));
}
}
}
Run Code Online (Sandbox Code Playgroud)
class UsersPage extends StatefulWidget {
const UsersPage({Key? key}) : super(key: key);
@override
_UsersPageState createState() => _UsersPageState();
}
class _UsersPageState extends State<UsersPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Users")),
body: BlocProvider(
create: (context) => UsersCubit(),
child: BlocConsumer<UsersCubit, UsersState>(
listener: (context, state) {
if(state is UsersLoading){
print("getting users …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用肘节来管理状态的应用程序。很多时候,当我需要发出 API 请求时,我需要获取当前的本地化信息(处理可能的异常),然后将其发送到后端。所以我想我应该使用肘来请求并获取当前的本地化。
我的问题是我应该如何处理?我可以gpsLocalizationCubit从另一肘处打电话吗?我应该使用 bloc 侦听器进行调用gpsLocalizationCubit并成功调用吗?requestCubit但是,那么我应该如何管理对于获取本地化和 API 请求都应该可见的加载屏幕呢?另一个问题是我在单个视图中有多个类似的请求(需要使用当前本地化)。
我有一个带有三个小部件 [widgetA、widgetB、widgetC] 的屏幕,我有一个 bloc[BlocA] 负责数据获取并在该屏幕上显示我有三个事件 [eventA、eventB、eventC] 渲染小部件 [ widgetA、widgetB、widgetC] 和我有三个状态 [stateA、stateB、stateC],它们负责管理小部件的状态 [widgetA、widgetB、widgetC] 我已附加所有代码来重现和测试该案例。
我一次只能显示一种状态及其各自的小部件,而我想根据它们的事件显示所有三种状态及其小部件。任何帮助将不胜感激。
我尝试实现相同目标的唯一方法是为每个小部件创建单独的块和事件类,但不知何故我对这种方法不满意。
实现这个用例的最佳方法是什么?
测试屏幕
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:locus/blocs/test/testbloc.dart';
class TestScreen extends StatelessWidget {
const TestScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => TestBloc()..add(const TestEvent1()),
child: Scaffold(
appBar: AppBar(
title: const Text('Test'),
),
body: Stack(
children: [
Builder(builder: (context) {
return Padding(
padding: const EdgeInsets.only(top: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () =>
context.read<TestBloc>().add(const TestEvent1()),
child: const Text("Event1")), …Run Code Online (Sandbox Code Playgroud) 我想用 Flutter 构建一个数学应用程序。应该有基本的功能。但是,我面临以下问题:当我的计时器耗尽并且我被定向到下一页时,会出现以下错误消息:
\n完成小部件树时抛出以下断言:\n查找已停用小部件的祖先是不安全的。
\n此时小部件的元素树的状态不再稳定。
\n要在 widget 的 dispose() 方法中安全地引用它的祖先,请通过在 widget 的 didChangeDependency() 方法中调用 dependentOnInheritedWidgetOfExactType() 来保存对祖先的引用。
\nclass MathFunctionScreen extends StatefulWidget {\n static String id = "MathFunctionScreen";\n const MathFunctionScreen({Key? key}) : super(key: key);\n @override\n State<MathFunctionScreen> createState() => _MathFunctionScreenState();\n}\n\nclass _MathFunctionScreenState extends State<MathFunctionScreen>\n with TickerProviderStateMixin {\n DataBase db = DataBase();\n late int myTime;\n late int timeStamp;\n @override\n void initState() {\n print("initState() wurde ausgef\xc3\xbchrt");\n Provider.of<NumberGenerator>(context, listen: false).ctrl;\n myOnChange();\n Provider.of<NumberGenerator>(context, listen: false).mathCorrectAnswer;\n Provider.of<NumberGenerator>(context, listen: false).operator;\n Provider.of<NumberGenerator>(context, listen: false).setDatabase();\n Provider.of<TimerProvider>(context, listen: false).startTimer(context);\n …Run Code Online (Sandbox Code Playgroud)