FLUTTER: How to set auto font size in TextSpan - flutter

I want to implement that text with divider in between lines:
Smart City Text
Do you guys have any ideas how can I implement that in flutter? I tried few things but it is kind of a challenge for me, because I am beginner. Divider line have to be long as text above and under line.

You can make a screen using auto_size_text package.
Using AutoSizeText and AutoSizeText.rich widget in that package,
and set a maxLines option to 1 and set font size big.
Because we set maxLines to 1, although set font size big, text will not be overflowed screen.
import 'package:auto_size_text/auto_size_text.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
#override
void initState() {
super.initState();
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: _buildBody(),
floatingActionButton: FloatingActionButton(
onPressed: () {},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
Widget _buildBody() {
return Container(
padding: EdgeInsets.symmetric(horizontal: 50, vertical: 30),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
AutoSizeText(
'Smart City',
maxLines: 1,
style: TextStyle(
fontSize: 100,
fontWeight: FontWeight.bold,
),
),
Divider(color: Colors.black),
AutoSizeText.rich(
TextSpan(
children: [
TextSpan(
text: 'Advanced',
),
TextSpan(
text: ' urban',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
TextSpan(
text: ' lighting solution',
),
],
),
style: TextStyle(fontSize: 100),
maxLines: 1,
),
],
),
);
}
}

Related

Initiate the display of multiple text sequentially using animated_text_kit plugin on flutter

I have implemented a TyperAnimatedTextKit as so:
TyperAnimatedTextKit(
onTap: () {
print("Tap Event");
},
text: [
"Welcome to this application!",
"This application demonstrates TyperAnimatedTextKit",
],
displayFullTextOnTap: true,
isRepeatingAnimation: false,
speed: new Duration(milliseconds: 50),
textStyle: TextStyle(
fontSize: 24.0,
fontFamily: "Arvo-Regular",
color: Colors.white,
),
textAlign: TextAlign.center,
alignment: AlignmentDirectional.centerStart,
onFinished: intiateWidget2(),
)
Now I need to use intiateWidget2() to start another TyperAnimatedTextKit to type.
Basically I want the second 'TyperAnimatedTextKit' to start typing after the first one finishes.
Please advise as to how I should go about implementing this.
Edit 1(04/07/2020): The two TyperAnimatedTextKit widgets need to be implemented at different locations.
A simple way to do this is use a variable for the TyperAnimatedTextKit widget in the Widget tree, initialize that variable in initState() with an instance of TyperAnimatedTextKit (the first instance), then, in initiateWidget2, set that variable to a new instance of TyperAnimatedTextKit (the second instance), in a setState() call. The catch is, the TyperAnimatedTextKits have to be initialized with a different key or the animation won't play for the second instance. I tried to put this in code below, hth:
import 'package:flutter/material.dart';
import 'package:animated_text_kit/animated_text_kit.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
canvasColor: Colors.black,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
TyperAnimatedTextKit _animatedTextWidget;
Widget _animatedTextWidget2 = Container();
#override
void initState() {
_animatedTextWidget = intiateWidget1();
super.initState();
}
TyperAnimatedTextKit intiateWidget1() {
print('initiate 1');
return TyperAnimatedTextKit(
key: GlobalKey(),
onTap: () {
print("Tap Event");
},
text: [
"Welcome to this application!",
"This application demonstrates TyperAnimatedTextKit",
],
displayFullTextOnTap: true,
isRepeatingAnimation: false,
speed: new Duration(milliseconds: 50),
textStyle: TextStyle(
fontSize: 24.0,
fontFamily: "Arvo-Regular",
color: Colors.white,
),
textAlign: TextAlign.center,
alignment: AlignmentDirectional.centerStart,
onFinished: intiateWidget2
);
}
void intiateWidget2() {
print('in initiate 2');
setState(() {
this._animatedTextWidget2 = TyperAnimatedTextKit(
key: GlobalKey(),
onTap: () {
print("Tap Event");
},
text: [
"Let's get started",
"with our top secret impossible mission",
],
displayFullTextOnTap: true,
isRepeatingAnimation: false,
speed: new Duration(milliseconds: 50),
textStyle: TextStyle(
fontSize: 24.0,
fontFamily: "Arvo-Regular",
color: Colors.green,
),
textAlign: TextAlign.center,
alignment: AlignmentDirectional.centerStart,
onFinished: () => print('finished the second'));
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
this._animatedTextWidget,
Container(height: 15,),
this._animatedTextWidget2
],
),
)
);
}
}

How to Implement fontSize adjustment dialog box in flutter?

I am new to flutter. I have taken inspiration from this app https://play.google.com/store/apps/details?id=com.nikitadev.usconstitution&hl=en and I am implementing the fontsize adjustment dialogbox with flutter. I am really stuck.
Make static variable and use the value in your default theme. When font size is increased set the value of that variable to this font size.
//Initialize a variable at the top to change
double _textDefaultSize = 16;
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
#override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
#override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
textTheme: TextTheme(
bodyText1: TextStyle(
fontSize: _textDefaultSize,
//Use the text Size in the main theme
),
),
),
home: Scaffold(
backgroundColor: Colors.red,
appBar: AppBar(
title: Text("TextColor checking"),
),
body: Center(
child: Column(
children: <Widget>[
Text(
"Example Text",
style: TextStyle(fontSize: _textDefaultSize),
//Use the font size in all texts
),
FlatButton(
onPressed: () {
setState() {
_textDefaultSize++; //Change the value of variable here
}
},
child: Text("Increase Size"),
),
FlatButton(
onPressed: () {
setState() {
_textDefaultSize--; //Change the value of variable here
}
},
child: Text("Increase Size"),
),
],
),
),
),
);
}
}
```

How to create custom InlineSpans in Flutter?

How can I reuse pieces of code of InlineSpan type (e.g. TextSpan, WidgetSpan).
For example,
Text.rich(
TextSpan(
children: [
WidgetSpan(...), // code I like to reuse
... // other stuff
],
),
)
Of course I can write a function, that gives me this InlineSpan, like this:
InlineSpan myCustomWidgetSpan() {
return WidgetSpan(...);
}
This is technically ok, but usually I reuse parts of code by creating a class that extends some other Flutter class (like StatelessWidget or StatefulWidget).
I think that there should be some more idiomatic approach to this. So what are the best practices for reusing code that produces InlineSpan?
You can copy paste run full code below
You can use package https://pub.dev/packages/span_builder
code snippet
final spans = SpanBuilder("The quick brown fox")
.apply(TextSpan(text: "brown", style: TextStyle(fontWeight: FontWeight.bold)))
.apply(TextSpan(text: "🦊"), whereText: "fox")
.build();
Text.rich(
TextSpan(
children: spans
),
),
working demo
full code
import 'package:flutter/material.dart';
import 'package:span_builder/span_builder.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
final spans = SpanBuilder("The quick brown fox")
.apply(TextSpan(text: "brown", style: TextStyle(fontWeight: FontWeight.bold)))
.apply(TextSpan(text: "🦊"), whereText: "fox")
.build();
void _incrementCounter() {
setState(() {
_counter++;
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text.rich(
TextSpan(
children: spans
),
),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}

Flutter Web: How to fix SelectableText alignment?

I have a SelectableText and Icon inside a Row, but SelectableText does not seem to be properly aligned.
Right now it looks like this,
Expected Result:
This is code I am using,
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Icon(FontAwesomeIcons.whatsapp),
const Padding(padding: EdgeInsets.only(left: 8)),
SelectableText(
'+91-8**2**8**5',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.title,
)
],
),
PS: It works well with Text but I want SelectableText instead.
Issue Selectabletext widget on web is cutted on half
https://github.com/flutter/flutter/issues/40663 has been solved.
please upgrade to latest version
attached my full test code and result
full test code
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Icon(FontAwesomeIcons.whatsapp),
const Padding(padding: EdgeInsets.only(left: 8)),
SelectableText(
'+91-8**2**8**5',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.title,
)
],
),
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}

Using FontAwesomeIcons with value from custom class in Flutter

I'm trying to use fontawesome together with flutter. Depending on certain content of an Item I'd like to display a certain Icon from fontawesome.
Transaction(id: 1, title: 'lunch', amount: -23.10, type:'utensils'),
Transaction(id: 2, title: 'new shows', amount: -59.99, type:'tshirt'),
Transaction(id: 3, title: 'Falcon launch', amount: -62000000, type:'rocket')
so, I'd like to use the type as an indicator for my fontawesome icon.
When using FontAwesomeIcons.rocket, everything works quite well.
Column(children: <Widget>[
Card(
child: IconButton(
onPressed: null,
icon: new Icon(FontAwesomeIcons.rocket),
),
elevation: 0,
)
],),
since I'm using the map function I'm able to call the type itself without an issue like Text(tx.type). Is there a way to replace the static (in my case) rocket with the type from my transaction class? I'm trying to avoid if/switch cases at the moment just to get the basics going.
Any help very appreciated.
You can copy paste run full code below
You can use https://pub.dev/packages/icons_helper
just prefix rocket with fa.rocket
code snippet
Icon(getIconUsingPrefix(name: 'fa.rocket'),
color: Theme.of(context).backgroundColor, size: 60.0),
working demo
full code
import 'package:flutter/material.dart';
import 'package:icons_helper/icons_helper.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
#override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo + Icon Helper Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
#override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
Map iconMap = {"a":'fa.rocket'};
void _incrementCounter() {
setState(() {
_counter++;
});
}
#override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(getIconUsingPrefix(name: 'fa.fiveHundredPx'),
color: Theme.of(context).backgroundColor, size: 60.0),
Icon(getIconUsingPrefix(name: 'fa.rocket'),
color: Theme.of(context).backgroundColor, size: 60.0),
Icon(getIconUsingPrefix(name: iconMap["a"]),
color: Theme.of(context).backgroundColor, size: 60.0),
Text(
'There should be an icon above. It\'s neat, isn\'t?\n\nYou can also push the + button and increment this counter for fun:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}