| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/material.dart'; |
| import 'package:flutter/semantics.dart'; |
| import 'package:google_fonts/google_fonts.dart'; |
| |
| void main() => runApp(const MyApp(Colors.blue)); |
| |
| @pragma('vm:entry-point') |
| void topMain() => runApp(const MyApp(Colors.green)); |
| |
| @pragma('vm:entry-point') |
| void bottomMain() => runApp(const MyApp(Colors.purple)); |
| |
| class MyApp extends StatelessWidget { |
| const MyApp(this.color, {super.key}); |
| |
| final Color color; |
| |
| @override |
| Widget build(BuildContext context) { |
| return MaterialApp( |
| title: 'Flutter Demo', |
| theme: ThemeData( |
| primarySwatch: color as MaterialColor, |
| ), |
| home: const MyHomePage(title: 'Flutter Demo Home Page'), |
| ); |
| } |
| } |
| |
| class MyHomePage extends StatefulWidget { |
| const MyHomePage({super.key, this.title}); |
| final String? title; |
| |
| @override |
| State<MyHomePage> createState() => _MyHomePageState(); |
| } |
| |
| class Sky extends CustomPainter { |
| @override |
| void paint(Canvas canvas, Size size) { |
| final Rect rect = Offset.zero & size; |
| const RadialGradient gradient = RadialGradient( |
| center: Alignment(0.7, -0.6), |
| radius: 0.2, |
| colors: <Color>[Color(0xFFFFFF00), Color(0xFF0099FF)], |
| stops: <double>[0.4, 1.0], |
| ); |
| canvas.drawRect( |
| rect, |
| Paint()..shader = gradient.createShader(rect), |
| ); |
| } |
| |
| @override |
| SemanticsBuilderCallback get semanticsBuilder { |
| return (Size size) { |
| // Annotate a rectangle containing the picture of the sun |
| // with the label "Sun". When text to speech feature is enabled on the |
| // device, a user will be able to locate the sun on this picture by |
| // touch. |
| Rect rect = Offset.zero & size; |
| final double width = size.shortestSide * 0.4; |
| rect = const Alignment(0.8, -0.9).inscribe(Size(width, width), rect); |
| return <CustomPainterSemantics>[ |
| CustomPainterSemantics( |
| rect: rect, |
| properties: const SemanticsProperties( |
| label: 'Sun', |
| textDirection: TextDirection.ltr, |
| ), |
| ), |
| ]; |
| }; |
| } |
| |
| // Since this Sky painter has no fields, it always paints |
| // the same thing and semantics information is the same. |
| // Therefore we return false here. If we had fields (set |
| // from the constructor) then we would return true if any |
| // of them differed from the same fields on the oldDelegate. |
| @override |
| bool shouldRepaint(Sky oldDelegate) => false; |
| @override |
| bool shouldRebuildSemantics(Sky oldDelegate) => false; |
| } |
| |
| class _MyHomePageState extends State<MyHomePage> { |
| @override |
| Widget build(BuildContext context) { |
| return Scaffold( |
| appBar: AppBar( |
| title: Text(widget.title ?? ''), |
| ), |
| body: Center( |
| child: SingleChildScrollView( |
| child: Column( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| Text( |
| 'You have pushed the button this many times:', |
| style: GoogleFonts.lato(), |
| ), |
| Text( |
| '0', |
| style: Theme.of(context).textTheme.headlineMedium, |
| ), |
| TextButton( |
| onPressed: () {}, |
| child: const Text('Add'), |
| ), |
| TextButton( |
| onPressed: () {}, |
| child: const Text('Next'), |
| ), |
| Row( |
| mainAxisAlignment: MainAxisAlignment.spaceAround, |
| children: <Widget>[ |
| const Icon( |
| Icons.favorite, |
| color: Colors.pink, |
| size: 24.0, |
| semanticLabel: 'Text to announce in accessibility modes', |
| ), |
| const Icon( |
| Icons.audiotrack, |
| color: Colors.green, |
| size: 30.0, |
| ), |
| const Icon( |
| Icons.beach_access, |
| color: Colors.blue, |
| size: 36.0, |
| ), |
| const Icon( |
| Icons.zoom_out, |
| color: Colors.amber, |
| size: 36.0, |
| ), |
| const Icon( |
| Icons.money, |
| color: Colors.lightGreen, |
| size: 36.0, |
| ), |
| const Icon( |
| Icons.bug_report, |
| color: Colors.teal, |
| size: 36.0, |
| ), |
| Container( |
| width: 36.0, |
| height: 36.0, |
| decoration: const BoxDecoration( |
| gradient: LinearGradient( |
| begin: Alignment.topLeft, |
| end: Alignment(0.8, |
| 0.0), // 10% of the width, so there are ten blinds. |
| colors: <Color>[ |
| Color(0xffee0000), |
| Color(0xffeeee00), |
| ], // red to yellow |
| tileMode: TileMode |
| .repeated, // repeats the gradient over the canvas |
| ), |
| ), |
| ), |
| ], |
| ), |
| CustomPaint( |
| painter: Sky(), |
| size: const Size(200.0, 36.0), |
| ), |
| ], |
| ), |
| ), |
| ), |
| ); |
| } |
| } |