-
Notifications
You must be signed in to change notification settings - Fork 79
Open
Description
The following error started after upgrading to v0.8.0
Code sample
import 'package:flutter/material.dart';
import 'package:confetti/confetti.dart';
void main() {
runApp(
MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('Layout builder issue in v0.8')),
body: const ConfettiLayoutBuilderIssue(),
),
),
);
}
class ConfettiLayoutBuilderIssue extends StatelessWidget {
const ConfettiLayoutBuilderIssue({super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FilledButton.tonal(
onPressed: () => showDialog(
context: context,
builder: (_) =>
const AlertDialog(title: BalanceWidget(message: 'Tap to change value')),
),
child: const Text('Tap to open dialog with confetti, I crash'),
),
const SizedBox(height: 20),
const BalanceWidget(message: 'Tap to change value, I do not crash'),
],
),
);
}
}
class BalanceWidget extends StatefulWidget {
const BalanceWidget({super.key, required this.message});
final String message;
@override
State<BalanceWidget> createState() => _BalanceWidgetState();
}
class _BalanceWidgetState extends State<BalanceWidget> {
double _balance = 20.0;
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.center,
children: [
FilledButton.tonal(
onPressed: () {
_balance += 15;
setState(() {});
},
child: Text('${widget.message} ${_balance.toString()}'),
),
_Confetti(value: _balance),
],
);
}
}
class _Confetti extends StatefulWidget {
const _Confetti({this.value});
final double? value;
@override
State<_Confetti> createState() => _ConfettiState();
}
class _ConfettiState extends State<_Confetti> {
late ConfettiController _confettiController;
double? get value => widget.value;
@override
void initState() {
super.initState();
_confettiController = ConfettiController(duration: const Duration(seconds: 1));
}
@override
void dispose() {
_confettiController.dispose();
super.dispose();
}
@override
void didUpdateWidget(_Confetti oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.value != widget.value && oldWidget.value != null && widget.value != null) {
_confettiController.play();
}
}
@override
Widget build(BuildContext context) {
return ConfettiWidget(
confettiController: _confettiController,
blastDirectionality: BlastDirectionality.explosive,
shouldLoop: false,
);
}
}
Error
The following assertion was thrown during performLayout():
LayoutBuilder does not support returning intrinsic dimensions.
Calculating the intrinsic dimensions would require running the layout callback speculatively, which might mutate the live render object tree.
The relevant error-causing widget was: AlertDialog AlertDialog:/confetti/confetti_layout_builder_issue.dart:29:25
When the exception was thrown, this was the stack:
#0 _RenderLayoutBuilder._debugThrowIfNotCheckingIntrinsics.<anonymous closure> (package:flutter/src/widgets/layout_builder.dart:399:9)
#1 _RenderLayoutBuilder._debugThrowIfNotCheckingIntrinsics (package:flutter/src/widgets/layout_builder.dart:406:6)
#2 _RenderLayoutBuilder.computeMaxIntrinsicHeight (package:flutter/src/widgets/layout_builder.dart:344:12)
#3 _IntrinsicDimension.memoize.<anonymous closure> (package:flutter/src/rendering/box.dart:1052:49)
#4 _LinkedHashMapMixin.putIfAbsent (dart:collection-patch/compact_hash.dart:543:23)
#5 _IntrinsicDimension.memoize (package:flutter/src/rendering/box.dart:1052:8)
#6 RenderBox._computeWithTimeline (package:flutter/src/rendering/box.dart:1549:32)
#7 RenderBox._computeIntrinsics (package:flutter/src/rendering/box.dart:1527:26)
Metadata
Metadata
Assignees
Labels
No labels