// 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 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(0xFFFFFF00), Color(0xFF0099FF)], stops: [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( 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 { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title ?? ''), ), body: Center( child: SingleChildScrollView( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ 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: [ 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(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), ), ], ), ), ), ); } }