Unverified Commit dd2ea7c5 authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Migrate all of examples/layers to sound null safety (#68744)

parent 8273b992
...@@ -604,7 +604,7 @@ Future<void> _runFrameworkTests() async { ...@@ -604,7 +604,7 @@ Future<void> _runFrameworkTests() async {
await _runFlutterTest(path.join(flutterRoot, 'dev', 'manual_tests'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'dev', 'manual_tests'), tableData: bigqueryApi?.tabledata);
await _runFlutterTest(path.join(flutterRoot, 'dev', 'tools', 'vitool'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'dev', 'tools', 'vitool'), tableData: bigqueryApi?.tabledata);
await _runFlutterTest(path.join(flutterRoot, 'examples', 'hello_world'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'examples', 'hello_world'), tableData: bigqueryApi?.tabledata);
await _runFlutterTest(path.join(flutterRoot, 'examples', 'layers'), tableData: bigqueryApi?.tabledata, options: mixedModeNullSafetyOptions); await _runFlutterTest(path.join(flutterRoot, 'examples', 'layers'), tableData: bigqueryApi?.tabledata, options: soundNullSafetyOptions);
await _runFlutterTest(path.join(flutterRoot, 'dev', 'benchmarks', 'test_apps', 'stocks'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'dev', 'benchmarks', 'test_apps', 'stocks'), tableData: bigqueryApi?.tabledata);
await _runFlutterTest(path.join(flutterRoot, 'packages', 'flutter_driver'), tableData: bigqueryApi?.tabledata, tests: <String>[path.join('test', 'src', 'real_tests')]); await _runFlutterTest(path.join(flutterRoot, 'packages', 'flutter_driver'), tableData: bigqueryApi?.tabledata, tests: <String>[path.join('test', 'src', 'real_tests')]);
await _runFlutterTest(path.join(flutterRoot, 'packages', 'flutter_goldens'), tableData: bigqueryApi?.tabledata); await _runFlutterTest(path.join(flutterRoot, 'packages', 'flutter_goldens'), tableData: bigqueryApi?.tabledata);
......
...@@ -2,7 +2,7 @@ name: flutter_examples_layers ...@@ -2,7 +2,7 @@ name: flutter_examples_layers
environment: environment:
# The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite. # The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
sdk: ">=2.0.0-dev.68.0 <3.0.0" sdk: ">=2.10.0-0.0.dev <3.0.0"
dependencies: dependencies:
flutter: flutter:
......
...@@ -9,7 +9,7 @@ import 'dart:typed_data'; ...@@ -9,7 +9,7 @@ import 'dart:typed_data';
import 'dart:ui' as ui; import 'dart:ui' as ui;
// A paragraph represents a rectangular region that contains some text. // A paragraph represents a rectangular region that contains some text.
ui.Paragraph paragraph; late ui.Paragraph paragraph;
ui.Picture paint(ui.Rect paintBounds) { ui.Picture paint(ui.Rect paintBounds) {
final ui.PictureRecorder recorder = ui.PictureRecorder(); final ui.PictureRecorder recorder = ui.PictureRecorder();
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'dart:ui' as ui; import 'dart:ui' as ui;
ui.Color color; late ui.Color color;
ui.Picture paint(ui.Rect paintBounds) { ui.Picture paint(ui.Rect paintBounds) {
// First we create a PictureRecorder to record the commands we're going to // First we create a PictureRecorder to record the commands we're going to
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.10
// This example shows how to build a render tree with a non-cartesian coordinate // This example shows how to build a render tree with a non-cartesian coordinate
// system. Most of the guts of this examples are in src/sector_layout.dart. // system. Most of the guts of this examples are in src/sector_layout.dart.
......
...@@ -48,7 +48,7 @@ void main() { ...@@ -48,7 +48,7 @@ void main() {
subrow.add(RenderSolidColorBox(const Color(0x7FCCFFFF), desiredSize: const Size(30.0, 40.0))); subrow.add(RenderSolidColorBox(const Color(0x7FCCFFFF), desiredSize: const Size(30.0, 40.0)));
row.add(subrow); row.add(subrow);
table.add(row); table.add(row);
final FlexParentData rowParentData = row.parentData as FlexParentData; final FlexParentData rowParentData = row.parentData! as FlexParentData;
rowParentData.flex = 1; rowParentData.flex = 1;
} }
...@@ -71,7 +71,7 @@ void main() { ...@@ -71,7 +71,7 @@ void main() {
row.add(RenderSolidColorBox(const Color(0xFFCCCCFF), desiredSize: const Size(160.0, 60.0))); row.add(RenderSolidColorBox(const Color(0xFFCCCCFF), desiredSize: const Size(160.0, 60.0)));
row.mainAxisAlignment = justify; row.mainAxisAlignment = justify;
table.add(row); table.add(row);
final FlexParentData rowParentData = row.parentData as FlexParentData; final FlexParentData rowParentData = row.parentData! as FlexParentData;
rowParentData.flex = 1; rowParentData.flex = 1;
} }
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.10
import 'dart:math' as math; import 'dart:math' as math;
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
......
...@@ -20,7 +20,7 @@ List<Color> _kColors = <Color>[ ...@@ -20,7 +20,7 @@ List<Color> _kColors = <Color>[
/// A simple model object for a dot that reacts to pointer pressure. /// A simple model object for a dot that reacts to pointer pressure.
class Dot { class Dot {
Dot({ Color color }) : _paint = Paint()..color = color; Dot({ required Color color }) : _paint = Paint()..color = color;
final Paint _paint; final Paint _paint;
Offset position = Offset.zero; Offset position = Offset.zero;
...@@ -65,7 +65,7 @@ class RenderDots extends RenderBox { ...@@ -65,7 +65,7 @@ class RenderDots extends RenderBox {
@override @override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event is PointerDownEvent) { if (event is PointerDownEvent) {
final Color color = _kColors[event.pointer.remainder(_kColors.length) as int]; final Color color = _kColors[event.pointer.remainder(_kColors.length)];
_dots[event.pointer] = Dot(color: color)..update(event); _dots[event.pointer] = Dot(color: color)..update(event);
// We call markNeedsPaint to indicate that our painting commands have // We call markNeedsPaint to indicate that our painting commands have
// changed and that paint needs to be called before displaying a new frame // changed and that paint needs to be called before displaying a new frame
...@@ -76,7 +76,7 @@ class RenderDots extends RenderBox { ...@@ -76,7 +76,7 @@ class RenderDots extends RenderBox {
_dots.remove(event.pointer); _dots.remove(event.pointer);
markNeedsPaint(); markNeedsPaint();
} else if (event is PointerMoveEvent) { } else if (event is PointerMoveEvent) {
_dots[event.pointer].update(event); _dots[event.pointer]!.update(event);
markNeedsPaint(); markNeedsPaint();
} }
} }
...@@ -126,7 +126,7 @@ void main() { ...@@ -126,7 +126,7 @@ void main() {
// //
// We use the StackParentData of the paragraph to position the text in the top // We use the StackParentData of the paragraph to position the text in the top
// left corner of the screen. // left corner of the screen.
final StackParentData paragraphParentData = paragraph.parentData as StackParentData; final StackParentData paragraphParentData = paragraph.parentData! as StackParentData;
paragraphParentData paragraphParentData
..top = 40.0 ..top = 40.0
..left = 20.0; ..left = 20.0;
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:isolate'; import 'dart:isolate';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
...@@ -17,7 +16,7 @@ typedef OnResultListener = void Function(String result); ...@@ -17,7 +16,7 @@ typedef OnResultListener = void Function(String result);
// The choice of JSON parsing here is meant as an example that might surface // The choice of JSON parsing here is meant as an example that might surface
// in real-world applications. // in real-world applications.
class Calculator { class Calculator {
Calculator({ @required this.onProgressListener, @required this.onResultListener, String data }) Calculator({ required this.onProgressListener, required this.onResultListener, String? data })
: assert(onProgressListener != null), : assert(onProgressListener != null),
assert(onResultListener != null), assert(onResultListener != null),
// In order to keep the example files smaller, we "cheat" a little and // In order to keep the example files smaller, we "cheat" a little and
...@@ -53,7 +52,7 @@ class Calculator { ...@@ -53,7 +52,7 @@ class Calculator {
} }
} }
static String _replicateJson(String data, int count) { static String _replicateJson(String? data, int count) {
final StringBuffer buffer = StringBuffer()..write('['); final StringBuffer buffer = StringBuffer()..write('[');
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
buffer.write(data); buffer.write(data);
...@@ -85,7 +84,7 @@ class CalculationMessage { ...@@ -85,7 +84,7 @@ class CalculationMessage {
// This class manages these ports and maintains state related to the // This class manages these ports and maintains state related to the
// progress of the background computation. // progress of the background computation.
class CalculationManager { class CalculationManager {
CalculationManager({ @required this.onProgressListener, @required this.onResultListener }) CalculationManager({ required this.onProgressListener, required this.onResultListener })
: assert(onProgressListener != null), : assert(onProgressListener != null),
assert(onResultListener != null), assert(onResultListener != null),
_receivePort = ReceivePort() { _receivePort = ReceivePort() {
...@@ -120,7 +119,7 @@ class CalculationManager { ...@@ -120,7 +119,7 @@ class CalculationManager {
if (isRunning) { if (isRunning) {
_state = CalculationState.idle; _state = CalculationState.idle;
if (_isolate != null) { if (_isolate != null) {
_isolate.kill(priority: Isolate.immediate); _isolate!.kill(priority: Isolate.immediate);
_isolate = null; _isolate = null;
_completed = 0.0; _completed = 0.0;
_total = 1.0; _total = 1.0;
...@@ -129,7 +128,7 @@ class CalculationManager { ...@@ -129,7 +128,7 @@ class CalculationManager {
} }
final ReceivePort _receivePort; final ReceivePort _receivePort;
Isolate _isolate; Isolate? _isolate;
void _runCalculation() { void _runCalculation() {
// Load the JSON string. This is done in the main isolate because spawned // Load the JSON string. This is done in the main isolate because spawned
...@@ -209,8 +208,8 @@ class IsolateExampleState extends State<StatefulWidget> with SingleTickerProvide ...@@ -209,8 +208,8 @@ class IsolateExampleState extends State<StatefulWidget> with SingleTickerProvide
String _label = 'Start'; String _label = 'Start';
String _result = ' '; String _result = ' ';
double _progress = 0.0; double _progress = 0.0;
AnimationController _animation; late AnimationController _animation;
CalculationManager _calculationManager; late CalculationManager _calculationManager;
@override @override
void initState() { void initState() {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
class LifecycleWatcher extends StatefulWidget { class LifecycleWatcher extends StatefulWidget {
const LifecycleWatcher({ Key key }) : super(key: key); const LifecycleWatcher({ Key? key }) : super(key: key);
@override @override
_LifecycleWatcherState createState() => _LifecycleWatcherState(); _LifecycleWatcherState createState() => _LifecycleWatcherState();
...@@ -13,17 +13,17 @@ class LifecycleWatcher extends StatefulWidget { ...@@ -13,17 +13,17 @@ class LifecycleWatcher extends StatefulWidget {
class _LifecycleWatcherState extends State<LifecycleWatcher> class _LifecycleWatcherState extends State<LifecycleWatcher>
with WidgetsBindingObserver { with WidgetsBindingObserver {
AppLifecycleState _lastLifecycleState; AppLifecycleState? _lastLifecycleState;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance!.addObserver(this);
} }
@override @override
void dispose() { void dispose() {
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance!.removeObserver(this);
super.dispose(); super.dispose();
} }
......
...@@ -39,7 +39,7 @@ class RenderDots extends RenderConstrainedBox { ...@@ -39,7 +39,7 @@ class RenderDots extends RenderConstrainedBox {
} }
class Dots extends SingleChildRenderObjectWidget { class Dots extends SingleChildRenderObjectWidget {
const Dots({ Key key, Widget child }) : super(key: key, child: child); const Dots({ Key? key, Widget? child }) : super(key: key, child: child);
@override @override
RenderDots createRenderObject(BuildContext context) => RenderDots(); RenderDots createRenderObject(BuildContext context) => RenderDots();
......
...@@ -6,14 +6,14 @@ import 'package:flutter/material.dart'; ...@@ -6,14 +6,14 @@ import 'package:flutter/material.dart';
class _GesturePainter extends CustomPainter { class _GesturePainter extends CustomPainter {
const _GesturePainter({ const _GesturePainter({
this.zoom, required this.zoom,
this.offset, required this.offset,
this.swatch, required this.swatch,
this.forward, required this.forward,
this.scaleEnabled, required this.scaleEnabled,
this.tapEnabled, required this.tapEnabled,
this.doubleTapEnabled, required this.doubleTapEnabled,
this.longPressEnabled, required this.longPressEnabled,
}); });
final double zoom; final double zoom;
...@@ -61,12 +61,12 @@ class GestureDemo extends StatefulWidget { ...@@ -61,12 +61,12 @@ class GestureDemo extends StatefulWidget {
class GestureDemoState extends State<GestureDemo> { class GestureDemoState extends State<GestureDemo> {
Offset _startingFocalPoint; late Offset _startingFocalPoint;
Offset _previousOffset; late Offset _previousOffset;
Offset _offset = Offset.zero; Offset _offset = Offset.zero;
double _previousZoom; late double _previousZoom;
double _zoom = 1.0; double _zoom = 1.0;
static const List<MaterialColor> kSwatches = <MaterialColor>[ static const List<MaterialColor> kSwatches = <MaterialColor>[
...@@ -175,7 +175,7 @@ class GestureDemoState extends State<GestureDemo> { ...@@ -175,7 +175,7 @@ class GestureDemoState extends State<GestureDemo> {
children: <Widget>[ children: <Widget>[
Checkbox( Checkbox(
value: _scaleEnabled, value: _scaleEnabled,
onChanged: (bool value) { setState(() { _scaleEnabled = value; }); }, onChanged: (bool? value) { setState(() { _scaleEnabled = value!; }); },
), ),
const Text('Scale'), const Text('Scale'),
], ],
...@@ -184,7 +184,7 @@ class GestureDemoState extends State<GestureDemo> { ...@@ -184,7 +184,7 @@ class GestureDemoState extends State<GestureDemo> {
children: <Widget>[ children: <Widget>[
Checkbox( Checkbox(
value: _tapEnabled, value: _tapEnabled,
onChanged: (bool value) { setState(() { _tapEnabled = value; }); }, onChanged: (bool? value) { setState(() { _tapEnabled = value!; }); },
), ),
const Text('Tap'), const Text('Tap'),
], ],
...@@ -193,7 +193,7 @@ class GestureDemoState extends State<GestureDemo> { ...@@ -193,7 +193,7 @@ class GestureDemoState extends State<GestureDemo> {
children: <Widget>[ children: <Widget>[
Checkbox( Checkbox(
value: _doubleTapEnabled, value: _doubleTapEnabled,
onChanged: (bool value) { setState(() { _doubleTapEnabled = value; }); }, onChanged: (bool? value) { setState(() { _doubleTapEnabled = value!; }); },
), ),
const Text('Double Tap'), const Text('Double Tap'),
], ],
...@@ -202,7 +202,7 @@ class GestureDemoState extends State<GestureDemo> { ...@@ -202,7 +202,7 @@ class GestureDemoState extends State<GestureDemo> {
children: <Widget>[ children: <Widget>[
Checkbox( Checkbox(
value: _longPressEnabled, value: _longPressEnabled,
onChanged: (bool value) { setState(() { _longPressEnabled = value; }); }, onChanged: (bool? value) { setState(() { _longPressEnabled = value!; }); },
), ),
const Text('Long Press'), const Text('Long Press'),
], ],
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class AdaptedListItem extends StatelessWidget { class AdaptedListItem extends StatelessWidget {
const AdaptedListItem({ Key key, this.name }) : super(key: key); const AdaptedListItem({ Key? key, required this.name }) : super(key: key);
final String name; final String name;
...@@ -26,7 +26,7 @@ class AdaptedListItem extends StatelessWidget { ...@@ -26,7 +26,7 @@ class AdaptedListItem extends StatelessWidget {
} }
class AdaptedGridItem extends StatelessWidget { class AdaptedGridItem extends StatelessWidget {
const AdaptedGridItem({ Key key, this.name }) : super(key: key); const AdaptedGridItem({ Key? key, required this.name }) : super(key: key);
final String name; final String name;
...@@ -65,13 +65,13 @@ const double _kMaxTileWidth = 150.0; ...@@ -65,13 +65,13 @@ const double _kMaxTileWidth = 150.0;
const double _kGridViewBreakpoint = 450.0; const double _kGridViewBreakpoint = 450.0;
class AdaptiveContainer extends StatelessWidget { class AdaptiveContainer extends StatelessWidget {
const AdaptiveContainer({ Key key, this.names }) : super(key: key); const AdaptiveContainer({ Key? key, required this.names }) : super(key: key);
final List<String> names; final List<String> names;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (MediaQuery.of(context).size.width < _kGridViewBreakpoint) { if (MediaQuery.of(context)!.size.width < _kGridViewBreakpoint) {
return ListView( return ListView(
itemExtent: _kListItemExtent, itemExtent: _kListItemExtent,
children: names.map<Widget>((String name) => AdaptedListItem(name: name)).toList(), children: names.map<Widget>((String name) => AdaptedListItem(name: name)).toList(),
......
...@@ -54,9 +54,9 @@ class SectorAppState extends State<SectorApp> { ...@@ -54,9 +54,9 @@ class SectorAppState extends State<SectorApp> {
int index = 0; int index = 0;
while (index < actualSectorSizes.length && index < wantedSectorSizes.length && actualSectorSizes[index] == wantedSectorSizes[index]) while (index < actualSectorSizes.length && index < wantedSectorSizes.length && actualSectorSizes[index] == wantedSectorSizes[index])
index += 1; index += 1;
final RenderSectorRing ring = sectors.child as RenderSectorRing; final RenderSectorRing ring = sectors.child! as RenderSectorRing;
while (index < actualSectorSizes.length) { while (index < actualSectorSizes.length) {
ring.remove(ring.lastChild); ring.remove(ring.lastChild!);
actualSectorSizes.removeLast(); actualSectorSizes.removeLast();
} }
while (index < wantedSectorSizes.length) { while (index < wantedSectorSizes.length) {
......
...@@ -11,13 +11,13 @@ import '../rendering/src/solid_color_box.dart'; ...@@ -11,13 +11,13 @@ import '../rendering/src/solid_color_box.dart';
void addFlexChildSolidColor(RenderFlex parent, Color backgroundColor, { int flex = 0 }) { void addFlexChildSolidColor(RenderFlex parent, Color backgroundColor, { int flex = 0 }) {
final RenderSolidColorBox child = RenderSolidColorBox(backgroundColor); final RenderSolidColorBox child = RenderSolidColorBox(backgroundColor);
parent.add(child); parent.add(child);
final FlexParentData childParentData = child.parentData as FlexParentData; final FlexParentData childParentData = child.parentData! as FlexParentData;
childParentData.flex = flex; childParentData.flex = flex;
} }
// Solid color, Widget version // Solid color, Widget version
class Rectangle extends StatelessWidget { class Rectangle extends StatelessWidget {
const Rectangle(this.color, { Key key }) : super(key: key); const Rectangle(this.color, { Key? key }) : super(key: key);
final Color color; final Color color;
...@@ -31,8 +31,8 @@ class Rectangle extends StatelessWidget { ...@@ -31,8 +31,8 @@ class Rectangle extends StatelessWidget {
} }
} }
double value; double? value;
RenderObjectToWidgetElement<RenderBox> element; RenderObjectToWidgetElement<RenderBox>? element;
BuildOwner owner = BuildOwner(); BuildOwner owner = BuildOwner();
void attachWidgetTreeToRenderTree(RenderProxyBox container) { void attachWidgetTreeToRenderTree(RenderProxyBox container) {
element = RenderObjectToWidgetAdapter<RenderBox>( element = RenderObjectToWidgetAdapter<RenderBox>(
...@@ -58,7 +58,7 @@ void attachWidgetTreeToRenderTree(RenderProxyBox container) { ...@@ -58,7 +58,7 @@ void attachWidgetTreeToRenderTree(RenderProxyBox container) {
], ],
), ),
onPressed: () { onPressed: () {
value = value == null ? 0.1 : (value + 0.1) % 1.0; value = value == null ? 0.1 : (value! + 0.1) % 1.0;
attachWidgetTreeToRenderTree(container); attachWidgetTreeToRenderTree(container);
}, },
), ),
...@@ -77,17 +77,17 @@ void attachWidgetTreeToRenderTree(RenderProxyBox container) { ...@@ -77,17 +77,17 @@ void attachWidgetTreeToRenderTree(RenderProxyBox container) {
).attachToRenderTree(owner, element); ).attachToRenderTree(owner, element);
} }
Duration timeBase; Duration? timeBase;
RenderTransform transformBox; late RenderTransform transformBox;
void rotate(Duration timeStamp) { void rotate(Duration timeStamp) {
timeBase ??= timeStamp; timeBase ??= timeStamp;
final double delta = (timeStamp - timeBase).inMicroseconds.toDouble() / Duration.microsecondsPerSecond; // radians final double delta = (timeStamp - timeBase!).inMicroseconds.toDouble() / Duration.microsecondsPerSecond; // radians
transformBox.setIdentity(); transformBox.setIdentity();
transformBox.rotateZ(delta); transformBox.rotateZ(delta);
owner.buildScope(element); owner.buildScope(element!);
} }
void main() { void main() {
......
...@@ -10,7 +10,7 @@ class SpinningSquare extends StatefulWidget { ...@@ -10,7 +10,7 @@ class SpinningSquare extends StatefulWidget {
} }
class _SpinningSquareState extends State<SpinningSquare> with SingleTickerProviderStateMixin { class _SpinningSquareState extends State<SpinningSquare> with SingleTickerProviderStateMixin {
AnimationController _animation; late AnimationController _animation;
@override @override
void initState() { void initState() {
......
...@@ -78,13 +78,7 @@ class StyledTextDemo extends StatefulWidget { ...@@ -78,13 +78,7 @@ class StyledTextDemo extends StatefulWidget {
} }
class _StyledTextDemoState extends State<StyledTextDemo> { class _StyledTextDemoState extends State<StyledTextDemo> {
@override _TextTransformer _toText = toStyledText;
void initState() {
super.initState();
_toText = toStyledText;
}
_TextTransformer _toText;
void _handleTap() { void _handleTap() {
setState(() { setState(() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment