标签: flutter-state

不要跨异步间隙使用 BuildContext

我注意到我的项目中出现了新的 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

240
推荐指数
7
解决办法
16万
查看次数

如何在 Flutter 应用程序的 initState 期间使用来自 Provider 的数据

我通过添加 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

15
推荐指数
3
解决办法
1万
查看次数

无状态小部件内有状态小部件,反之亦然

在以下情况下,Flutter 重建/重绘如何工作:

  • 在有状态小部件内创建无状态小部件。
  • 在无状态小部件内创建有状态小部件。

每次有状态小部件状态发生变化时,有状态小部件内的无状态小部件是否都会渲染?

有状态小部件可以在无状态小部件内更改吗?它如何影响无状态小部件?

flutter flutter-state

10
推荐指数
1
解决办法
5460
查看次数

10
推荐指数
1
解决办法
6661
查看次数

什么时候 route.didPop(result) 在 Flutter Navigator 2.0 中等于 false

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)

flutter flutter-navigation flutter-state

7
推荐指数
1
解决办法
997
查看次数

如何在initState中调用cubit类中的函数?

所以,我在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)

flutter bloc flutter-bloc flutter-state cubit

7
推荐指数
2
解决办法
1万
查看次数

我可以用另一肘来称呼肘吗?

我正在开发一个使用肘节来管理状态的应用程序。很多时候,当我需要发出 API 请求时,我需要获取当前的本地化信息(处理可能的异常),然后将其发送到后端。所以我想我应该使用肘来请求并获取当前的本地化。

我的问题是我应该如何处理?我可以gpsLocalizationCubit从另一肘处打电话吗?我应该使用 bloc 侦听器进行调用gpsLocalizationCubit并成功调用吗?requestCubit但是,那么我应该如何管理对于获取本地化和 API 请求都应该可见的加载屏幕呢?另一个问题是我在单个视图中有多个类似的请求(需要使用当前本地化)。

flutter flutter-bloc flutter-state cubit flutter-cubit

7
推荐指数
1
解决办法
2145
查看次数

如何使用 flutter bloc 在同一屏幕上管理多个状态

我有一个带有三个小部件 [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 bloc flutter-bloc flutter-state

6
推荐指数
1
解决办法
1万
查看次数

在其 dispose() 方法中安全地引用小部件的祖先

我想用 Flutter 构建一个数学应用程序。应该有基本的功能。但是,我面临以下问题:当我的计时器耗尽并且我被定向到下一页时,会出现以下错误消息:

\n

完成小部件树时抛出以下断言:\n查找已停用小部件的祖先是不安全的。

\n

此时小部件的元素树的状态不再稳定。

\n

要在 widget 的 dispose() 方法中安全地引用它的祖先,请通过在 widget 的 didChangeDependency() 方法中调用 dependentOnInheritedWidgetOfExactType() 来保存对祖先的引用。

\n
class 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)

navigation flutter flutter-dependencies flutter-state

6
推荐指数
1
解决办法
1万
查看次数

Flutter - 用户从应用程序注销后如何擦除提供商数据?

我在我的 flutter 应用程序中使用提供程序进行状态管理。我已经使用Multiprovider.

我想在用户从应用程序注销时擦除提供商数据我已读过评论但不太理解。

flutter flutter-provider flutter-state

5
推荐指数
1
解决办法
4496
查看次数