Flutter 堆栈小部件和Bloc Builder
我知道Flutter 堆栈小部件和Bloc Builder,flutter,dart,bloc,Flutter,Dart,Bloc,我知道Stack小部件从头开始渲染它们的子部件,但是,我无法向自己解释为什么BlocBuilder不能有效地重建它们 以下是一个例子: @override Widget build(BuildContext context) { return Container( child: BlocBuilder<TestCubit, int>( builder: (context, state) { return GestureDetector(
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')]),
);
},
)
);
}
@覆盖
小部件构建(构建上下文){
返回容器(
孩子:BlocBuilder(
生成器:(上下文、状态){
返回手势检测器(
onTapDown:(点击详情){
context.read().incrementCubit();
},
子:堆栈(子:[Text('Counter:$state')]),
);
},
)
);
}
当调用TestCubit
的incrementCubit
方法时,状态会发生变化-我使用一个简单的基于容器的UI对其进行了测试,但是一旦我们处理堆栈,屏幕上就不会发生任何事情。有什么想法吗
提前谢谢 我测试了您的代码,它既适用于堆栈,也适用于容器。请参阅下面我的代码:
主飞镖
导入“包装:颤振/材料.省道”;
进口“包装:颤振团/颤振团.飞镖”;
void main(){
runApp(
常量计数器应用(),
);
}
类计数器应用程序扩展了MaterialApp{
常量计数器应用程序({Key}):超级(Key:Key,home:const CounterPage());
}
类CounterPage扩展了无状态小部件{
常量计数器({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回BlocProvider(
创建:()=>TestCubit(),
子对象:CounterView(),
);
}
}
类计数器视图扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回容器(子项:BlocBuilder)(
生成器:(上下文、状态){
返回手势检测器(
onTapDown:(点击详情){
context.read().incrementCubit();
},
子:堆栈(子:[Text('Counter:$state')]),
//子项:文本('Counter:$state'),
//孩子:脚手架(
//appBar:appBar(标题:const Text(“Cubit Demo”),
//正文:中(
//子:堆栈(
//儿童:[
//Text('Counter:$state'),
// ],
// )),
//),
);
},
));
}
}
类TestCubit扩展了Cubit{
TestCubit():super(0);
void incrementCubit()=>emit(状态+1);
无效递减cubit()=>emit(状态-1);
}
公开发行
name:test\u http
描述:一个新的颤振应用。
发布到:“无”
版本:1.0.0+1
环境:
sdk:“>=2.7.0你好,蓝尼罗河,谢谢你看这个!你是对的,堆栈小部件不是问题所在。事实上,到目前为止,我设法进一步追踪到CustomPaint的问题,而CustomPaint在我的实际用例中似乎没有重建。听起来熟悉吗?。。。结果是CustomPainter的ShouldRepaint覆盖设置为false。。。愚蠢的错误我知道:)再次感谢!如果答案有助于您解决问题,请接受。谢谢
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);
}
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