Flutter “什么是”呢;肮脏的;在颤振和;这是什么原因造成的;肮脏的;国家?

Flutter “什么是”呢;肮脏的;在颤振和;这是什么原因造成的;肮脏的;国家?,flutter,state-management,getx,flutter-getx,Flutter,State Management,Getx,Flutter Getx,我试图通过这个演示项目学习状态管理和依赖注入。我正在尝试演示在所有地方注入一些方法,就像我可能需要在我的程序中那样。我之所以使用GetX,是因为我喜欢在非小部件类中不需要上下文就能做到这一点 所以我这里的问题是下面最后一个类中的最后一个方法summationReturns()。尝试使用返回语句获取方法并将它们添加到一起。我把这叫做两个地方。在浮动按钮中,这可以正常工作,但在我的文本小部件中,我得到一个脏状态错误 为什么在其他一切都起作用的情况下,这一切都不起作用?我认为这是最后一个问题的必然结果

我试图通过这个演示项目学习状态管理和依赖注入。我正在尝试演示在所有地方注入一些方法,就像我可能需要在我的程序中那样。我之所以使用GetX,是因为我喜欢在非小部件类中不需要上下文就能做到这一点

所以我这里的问题是下面最后一个类中的最后一个方法summationReturns()。尝试使用返回语句获取方法并将它们添加到一起。我把这叫做两个地方。在浮动按钮中,这可以正常工作,但在我的文本小部件中,我得到一个脏状态错误

为什么在其他一切都起作用的情况下,这一切都不起作用?我认为这是最后一个问题的必然结果,什么是肮脏状态?似乎是两个问题,但我可以想象它们是同一个问题

///
///
/// DEMO PROJECT WORKING OUT GETX
/// WORKOUT DEPENDANCY INJECTION AND STATE MANAGEMENT

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get/get_state_manager/get_state_manager.dart';

void main() {
  runApp(GetMaterialApp(
    home: Home(),
    debugShowCheckedModeBanner: false,
  ));
}

class Home extends StatelessWidget {
  // Injection of dependancy
  final Controller controller = Get.put(Controller());
  final Observable observable = Get.put(Observable());
  final SimpleMath simpleMath = Get.put(SimpleMath());

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('GetX Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Get builders:'),
            GetBuilder<Controller>(builder: (controller) {
              return Text(controller.count.toString());
            }),
            GetBuilder<Controller>(builder: (controller) {
              return Text(controller.countList.toString());
            }),
            GetBuilder<Controller>(builder: (controller) {
              return Text(controller.returnCount().toString());
            }),
            GetBuilder<Controller>(builder: (controller) {
              return Text(controller.returnList().toString());
            }),
            SizedBox(height: 20.0),
            Text('Get observables:'),
            Obx(() => Text(observable.count.value.toString())),
            Obx(() => Text(observable.countList.value.toString())),
            Obx(() => Text(observable.returnCount().toString())),
            Obx(() => Text(observable.returnList().toString())),
            SizedBox(height: 20.0),
            Text('Get from other class:'),
            GetBuilder<SimpleMath>(builder: (simpleMath) {
              return Text('Variable summation: ' + simpleMath.summationVariables().toString());
            }),
            GetBuilder<SimpleMath>(builder: (simpleMath) {
              return Text(simpleMath.summationReturns().toString());
            }),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          controller.crunch();
          observable.crunch();
          simpleMath.summationVariables();
          simpleMath.summationReturns();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class Controller extends GetxController {
  int count = 0;
  List<int> countList = [];

  void crunch() {
    count += 1;
    countList.add(count);
    update();
  }

  int returnCount() {
    return count;
  }

  List<int> returnList() {
    return countList;
  }
}

class Observable extends GetxController {
  RxInt count = 0.obs;
  Rx<RxList> countList = RxList().obs;

  void crunch() {
    count.value += 1;
    countList.value.add(count.value);
  }

  int returnCount() {
    return count.value;
  }

  List<dynamic> returnList() {
    return countList.value.toList();
  }
}

class SimpleMath extends GetxController {
  final Controller controller = Get.find<Controller>();
  final Observable observable = Get.find<Observable>();

  int summationVariables() {
    int sum = controller.count + observable.count.value;
    update();
    return sum;
  }

  int summationReturns() {
    int sum = controller.returnCount() + observable.returnCount();
    print('Summation of return values: ' + sum.toString());
    update();
    return sum;
  }
}
///
///
///开发GETX的演示项目
///训练依赖注入和状态管理
进口“包装:颤振/材料.省道”;
导入“package:get/get.dart”;
导入“包:get/get_state_manager/get_state_manager.dart”;
void main(){
runApp(GetMaterialApp(
home:home(),
debugShowCheckedModeBanner:false,
));
}
类Home扩展了无状态小部件{
//依赖性注射
最终控制器=Get.put(Controller());
最终可观测=Get.put(Observable());
final SimpleMath SimpleMath=Get.put(SimpleMath());
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“GetX演示”),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
Text('Get builders:'),
GetBuilder(生成器:(控制器){
返回文本(controller.count.toString());
}),
GetBuilder(生成器:(控制器){
返回文本(controller.countList.toString());
}),
GetBuilder(生成器:(控制器){
返回文本(controller.returnCount().toString());
}),
GetBuilder(生成器:(控制器){
返回文本(controller.returnList().toString());
}),
尺寸箱(高度:20.0),
Text('Get observables:'),
Obx(()=>Text(observable.count.value.toString()),
Obx(()=>Text(observable.countList.value.toString()),
Obx(()=>Text(observable.returnCount().toString()),
Obx(()=>Text(observable.returnList().toString()),
尺寸箱(高度:20.0),
Text('从其他类获取:'),
GetBuilder(生成器:(simpleMath){
返回文本('变量求和:'+simpleMath.summationVariables().toString());
}),
GetBuilder(生成器:(simpleMath){
返回文本(simpleMath.summationReturns().toString());
}),
],
),
),
浮动操作按钮:浮动操作按钮(
已按下:(){
controller.crunch();
可观察到的;
simpleMath.summationVariables();
simpleMath.summationReturns();
},
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
类控制器扩展了GetxController{
整数计数=0;
List countList=[];
虚空紧缩{
计数+=1;
countList.add(count);
更新();
}
int returnCount(){
返回计数;
}
列表返回列表(){
返回计数表;
}
}
类Observable扩展了GetxController{
RxInt计数=0.obs;
Rx countList=RxList().obs;
虚空紧缩{
count.value+=1;
countList.value.add(count.value);
}
int returnCount(){
返回count.value;
}
列表返回列表(){
返回countList.value.toList();
}
}
类SimpleMath扩展了GetxController{
最终控制器=Get.find();
最终可观测=Get.find();
int summationVariables(){
int sum=controller.count+observable.count.value;
更新();
回报金额;
}
int summationReturns(){
int sum=controller.returnCount()+observable.returnCount();
print('返回值之和:'+sum.toString());
更新();
回报金额;
}
}
错误:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following assertion was thrown building GetBuilder<SimpleMath>(dirty, state:
GetBuilderState<SimpleMath>#4d62d):
setState() or markNeedsBuild() called during build.
This GetBuilder<SimpleMath> widget cannot be marked as needing to build because the framework is
already in the process of building widgets.  A widget can be marked as needing to be built during
the build phase only if one of its ancestors is currently building. This exception is allowed
because the framework builds parent widgets before children, which means a dirty descendant will
always be built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was:
  GetBuilder<SimpleMath>
The widget which was currently being built when the offending call was made was:
  GetBuilder<SimpleMath>

The relevant error-causing widget was:
  GetBuilder<SimpleMath>
  file:///Users/robertobuttazzoni/Documents/Flutter%20Tutorials/Flutter%20Learning/getx_basics/getx_basics/lib/main.dart:57:13
══╡ WIDGETS库捕获到异常╞═══════════════════════════════════════════════════════════
在生成GetBuilder时引发了以下断言(脏,状态:
GetBuilderState(4d62d):
在生成过程中调用setState()或markNeedsBuild()。
无法将此GetBuilder小部件标记为需要生成,因为框架是
已经在构建小部件的过程中。可以将小部件标记为需要在
构建阶段仅在其祖先之一当前正在构建时进行。此例外是允许的
因为框架在子部件之前构建父部件,这意味着脏的子部件将
总是要建造。否则,框架可能不会在构建阶段访问此小部件。
调用setState()或markNeedsBuild()的小部件是:
GetBuilder
发出违规呼叫时当前正在构建的小部件是:
GetBuilder
导致错误的相关小部件是:
GetBuilder
file:///Users/robertobuttazzoni/Documents/Flutter%20Tutorials/Flutter%20Learning/getx_basics/getx_basics/lib/main.dart:57:13

在构建过程中调用
更新
就是一个肮脏场景的例子。要解决问题,请不要在
GetBuilder
中调用
update

样本

在家里

GetBuilder<SimpleMath>(
    builder: (simpleMath) => Text('Variable summation: ' +
        simpleMath
            .summationVariables(shouldUpdate: false)
            .toString())),
GetBuilder<SimpleMath>(
    builder: (simpleMath) => Text(simpleMath
        .summationReturns(shouldUpdate: false)
        .toString())),

在构建过程中调用
update
,就是脏场景的一个例子。要解决问题,请不要在
GetBuilder
中调用
update

样本

在家里

GetBuilder<SimpleMath>(
    builder: (simpleMath) => Text('Variable summation: ' +
        simpleMath
            .summationVariables(shouldUpdate: false)
            .toString())),
GetBuilder<SimpleMath>(
    builder: (simpleMath) => Text(simpleMath
        .summationReturns(shouldUpdate: false)
        .toString())),

结帐:,,Inasecat,我不知道如何应用这些答案。他们在足总有这样的表现