【问题标题】:Stack widget and Bloc Builder堆栈小部件和 Bloc Builder
【发布时间】:2020-11-17 04:55:35
【问题描述】:

我知道Stack 小部件从头开始渲染他们的孩子,但是,我无法向自己解释为什么 BlocBuilder 不能有效地重建它们。

这是一个例子:

@override
Widget build(BuildContext context) {
  return Container(
    child: BlocBuilder<TestCubit, int>(
      builder: (context, state) {
        return GestureDetector(
          onTapDown: (tapDetails) {
            context.read<TestCubit>().incrementCubit();
          },
          child: Stack(children: [Text('Counter: $state')]),
        );
      },
    )
  );
}

TestCubit 调用其incrementCubit 方法时,状态会发生变化——我使用基于Container 的简单UI 对其进行了测试,但是一旦我们处理堆栈,屏幕上就没有任何反应。有什么想法吗?

提前致谢!

【问题讨论】:

    标签: flutter dart bloc


    【解决方案1】:

    我测试了您的代码,它适用于 Stack 和 Container。请在下面查看我的代码:

    main.dart

    import 'package:flutter/material.dart';
    import 'package:flutter_bloc/flutter_bloc.dart';
    
    void main() {
      runApp(
        const CounterApp(),
      );
    }
    
    class CounterApp extends MaterialApp {
      const CounterApp({Key key}) : super(key: key, home: const CounterPage());
    }
    
    class CounterPage extends StatelessWidget {
      const CounterPage({Key key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return BlocProvider(
          create: (_) => TestCubit(),
          child: CounterView(),
        );
      }
    }
    
    class CounterView extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(child: BlocBuilder<TestCubit, int>(
          builder: (context, state) {
            return GestureDetector(
              onTapDown: (tapDetails) {
                context.read<TestCubit>().incrementCubit();
              },
              child: Stack(children: [Text('Counter: $state')]),
              //child: Text('Counter: $state'),
              //child: Scaffold(
              //   appBar: AppBar(title: const Text("Cubit Demo")),
              //   body: Center(
              //       child: Stack(
              //     children: [
              //       Text('Counter: $state'),
              //     ],
              //   )),
              //),
            );
          },
        ));
      }
    }
    
    class TestCubit extends Cubit<int> {
      TestCubit() : super(0);
      void incrementCubit() => emit(state + 1);
      void decrementCubit() => emit(state - 1);
    }
    

    pubspec.yaml

    name: test_http
    description: A new Flutter application.
    
    publish_to: 'none'
    
    version: 1.0.0+1
    
    environment:
      sdk: ">=2.7.0 <3.0.0"
    
    dependencies:
      flutter:
        sdk: flutter
      flutter_bloc:
    
    dev_dependencies:
      flutter_test:
        sdk: flutter
    
    flutter:
      uses-material-design: true
    

    【讨论】:

    • 你好 bluenile,感谢您查看此内容!你是对的,堆栈小部件不是问题。实际上,到目前为止,我设法将问题进一步追查到在我的实际用例中似乎没有重建的 CustomPaint。听起来很熟悉吗?
    • ... 结果是 CustomPainter 将其 ShouldRepaint 覆盖设置为 false... 我知道这是个愚蠢的错误 :) 再次感谢!
    • 如果它帮助您解决问题,请接受答案。谢谢。
    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2019-07-29
    • 2021-10-20
    相关资源
    最近更新 更多