Write flutter widget tests that uses GoogleFonts - flutter

I need to write a flutter widget test to test a widget with GoogleFonts plugin in use. However, it gives network failer which is correct as the test suit doesn't have access to the internet. The problem is GoogleFonts.majorMonoDisplayTextTheme is a static method which makes it impossible to mock the GoogleFont class when using in the widget test.
Error: google_fonts was unable to load font MajorMonoDisplay-Regular because the following exception occurred:
Exception: Failed to load font with URL: https://fonts.gstatic.com/s/a/9901077f5681d4ec7e01e0ebe4bd61ba47669c64a7aedea472cd94fe1175751b.ttf
Widget usage:
Container(
padding: EdgeInsets.only(top: 10),
child: Text(
_now,
style: GoogleFonts.majorMonoDisplayTextTheme(Theme.of(context).textTheme).headline3,
),
),
Widget test method:
testWidgets(
'Shoudl display _now text',
(WidgetTester tester) async {
await tester.pumpWidget(_TestWidgetWithGoogleFont);
await tester.pumpAndSettle();
expect(find.byType(Text), findsOneWidget);
});

There is another way to silence the error. Especially handy if you don't want to (or can't) add additional files to a project.
Simply add this line of code to a desired test:
setUp(() => GoogleFonts.config.allowRuntimeFetching = false);
This code disallows runtime fetching which is a process that raises the erorr in the first place.

First you have to provide the font in pubspec.yaml file
Just follow those step
Download the fort extract it.
Go to your project file and create a folder name it "assets" and inside assets folder create another folder called "fonts". In this fonts folder paste the font .tiff copy the file name in this case it is"MajorMonoDisplay-Regular.ttf"
Next you have to provide the font information in pubspec.yaml file
just copy paste those code.
fonts:
- family: MajorMonoDisplay
fonts:
- asset: assets/fonts/MajorMonoDisplay-Regular.ttf
Next in open terminal run "flutter pub get"
and now just provide the fort family in your TextStyle.
Example:
child: Column(
children: [
Text(
'Should display _now text',
style: TextStyle(
fontSize: 20,
fontFamily: 'MajorMonoDisplay',
),
)
],
),
If the front is not showing then close the app and rerun it.

Related

I cant see my images in my flutter project

I did to make a simple pokedex application for trying myself. I completed my project and I did not get any issue in android studio.Other hand, When I started my application, I cant see images to get in my project in emulator. Can anyone help me for this issue .
Can look at this extension.
https://github.com/AlejandroTaichu/Pokedex.git
I want to see images in my project when I was opened my project.I am new on programming so I cant fix that.
You have forgotten extension of image in your code
child: Image.asset("images/${pokemon.name}")),
Change to below code
child: Image.asset("images/${pokemon.name}.png")),
Or add image extension(.png) in names of pokeList
You need to change the image name(path) according to the assets image path include the image type.
Next you need to create a future and call future on Future Builder widget.
late final future = callPokemon();
class _PokemonHomepageState extends State<PokemonHomepage> {
Future<List<Pokemons>> callPokemon() async {
var pokeList = <Pokemons>[];
var p1 = Pokemons(pokeId: 1, name: "Charmender.png", health: 100, power: 250);
var p2 = Pokemons(pokeId: 2, name: "squirtle.png", health: 150, power: 300);
var p3 = Pokemons(pokeId: 3, name: "balbazar.png", health: 300, power: 500);
pokeList.add(p1);
pokeList.add(p2);
pokeList.add(p3);
return pokeList;
}
late final future = callPokemon();
#override
Widget build(BuildContext context) {
return Scaffold(
appBar:
AppBar(title: const Text("POKEDEX"), backgroundColor: Colors.green),
body: FutureBuilder<List<Pokemons>>(
future: future,
builder: (context, snapshot) {
Made a pr on git, you can merge it
I suggest you to use flutter_gen (https://pub.dev/packages/flutter_gen) for assets. I recently found this package & its really helpful when using multiple images from assets.
With flutter_gen you can just setup few things one time & you can directly get image widgets from this package.
Setup flutter_gen
dart pub global activate flutter_gen
Add these runners in your dev dependencies
dev_dependencies:
build_runner:
flutter_gen_runner:
Setup path of generated assets file
flutter_gen:
output: lib/generated/
There are many options in this step. You can check their documentation.
Set image folder path
assets:
- assets/images/
Put your images in the path added
After doing these steps you just need to run
flutter packages pub run build_runner build
This file will generate an assets file name assets.gen.dart inside the lib/generated folder as we setup in step 3.
Note that you have to run this command whenever you change folder name or images to regerenated the assets.gen.dart
Thats it.
When you are done with these steps, you can directly get the images from this assets.gen.dart file like this
import 'package:flutter_boilerplate/generated/assets.gen.dart';
Padding(
padding: const EdgeInsets.all(20),
child: SizedBox(
height: 200, child: Assets.images.cat1.image(width: 200),
),
),
The plus benefit is that these assets provided widget support intellisense, so there is no chance for spelling mistake. Plus you directly get a widget from this with all the properties of default Image widget.
It also supports advance image types like svg, lottie, flare as well.

Can't copy the file after build on flutter desktop application

in my project I can press the save button to copy a file inside flutter in debug mode and every thing works fine (the file copied), but after build and open the release application I can't copy the file with no error message, just the button pressed and nothing happened.
I tried to run the release application as administrator, but it's the same problem.
Widget buildButton() {
final isFormValid = name.isNotEmpty && path.isNotEmpty;
return Padding(
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
child: ElevatedButton(
style: ElevatedButton.styleFrom(
onPrimary: Colors.white,
primary: isFormValid ? null : Colors.grey.shade700,
),
onPressed: () async {
addOrUpdatePlan();
File PDF= File('assets/PDF/file.pdf');
File newPDF = await PDF.copy('$path/$name.pdf'); //////The Bug
},
child: Text(
'SAVE',
style: TextStyle(fontSize: 30),
),
),
);
}
You are using a relative path in your File constructor; that means that it will only work if the current working directory when the application is run happens to be the directory that the path is relative to. The working directory of an application is not controlled by where the application is, but how it was launched, so is not within your control as an application developer.
You should always use absolute paths, not relative paths, when writing applications. How you construct an absolute path for your use case depends on what the intended base directory is.

Does Flutter/Dart know what glyphs are available in loaded font files?

I am trying to put a specified unicode character into a Text widget, but only if there is a glyph available in the fontFamily font specified in the TextStyle.
What currently happens by design is the fontFamilyFallback font is checked for a glyph, and if not found then the system font is checked, then if still no glyph found a 'not found' style glyph is rendered instead - usually a box with an X inside (depends on system I think).
I wonder if there is a way to disable that fall-back or even better have a list of available glyphs before building the text widget?
Attached some example code, and the results of the code in a screenshot. The code uses two fonts available via google fonts, and attempts to output the euro unicode character \u20ac. You can see from the screenshot that Syne has a glyph at u20ac, but Arvo does not. This could also be validated in for example Windows Character map.
Flutter Code (nothing in texttheme other than fontsize):
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'No fontfamily, no fontfamilyfallback \u20AC',
),
Text(
'fontfamily Syne Tactile: \u20AC',
style: TextStyle(fontFamily: 'Syne'),
),
Text(
'fontfamily Arvo, no fontfamilyfallback \u20AC',
style: TextStyle(fontFamily: 'Arvo'),
),
Text(
'fontfamily Arvo, fontfamilyfallback: Syne Tactile \u20AC',
style:
TextStyle(fontFamily: 'Arvo', fontFamilyFallback: ['Syne']),
),
],
),
),
); }
pubspec.yaml:
fonts:
- family: Arvo
fonts:
- asset: assets/Arvo-Regular.ttf
- family: Syne
fonts:
- asset: assets/SyneTactile-Regular.ttf
Flutter Web Output
Found a bit of a hack/workaround. If I load the AdobeBlank font into the package, and use that as fontFamilyFallback, then a glyph with zero width is displayed. Not ideal (better to know before building), but sort of does the job.
Can also then try and determine width before building using something like this.
Hopefully there is a better answer out there still, as I'd much rather be able to load a font and know what glyphs are available somehow.

Flutter: show asset gif in alert dialog

I am trying to show this gif asset in my alert dialog, but get an error:
Another exception was thrown: Unable to load asset: assets/tutorial/lip.gif
But .png images work fine.
Here is my code for the alert dialog:
...
AlertDialog(
title: Text('Showing Lip'),
content: Container(
child: Image.asset(
'assets/tutorial/lip.gif',
height: 125.0,
width: 125.0,
),
),
...
Any help is appreciated!
you are using the right method to display a GIF.
Your problem is probably that the path for the file you trying to display isn't right.
Did you add this file in your pubspec.yaml file?
Here's the official documentation on how to add an asset to your Flutter project

How to add image in Flutter

I am developing Flutter app for the first time. I have an issue adding an image. I have a following questions:
Where to create an images folder?
Where to add assets tag in pubspec.ymal?
Is there any assets folder needed for this?
What I tried:
assets:
- images/lake.jpg
inside pubspec.ymal :
Full file :
name: my_flutter_app
description: A new Flutter application.
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true,
assets:
- images/lake.jpg
Error log :
#/properties/flutter/properties/uses-material-design: type: wanted [boolean] got true,
Error detected in pubspec.yaml:
Error building assets
FAILURE: Build failed with an exception.
* Where:
Script '/home/abc/Downloads/flutter/packages/flutter_tools/gradle/flutter.gradle' line: 435
* What went wrong:
Execution failed for task ':app:flutterBuildDebug'.
> Process 'command '/home/abc/Downloads/flutter/bin/flutter'' finished with non-zero exit value 1
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
BUILD FAILED in 1s
Finished with error: Gradle build failed: 1
My main.dart code :
// Copyright 2017 The Chromium 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';
// Uncomment lines 7 and 10 to view the visual layout at runtime.
//import 'package:flutter/rendering.dart' show debugPaintSizeEnabled;
void main() {
//debugPaintSizeEnabled = true;
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
Widget titleSection = new Container(
padding: const EdgeInsets.all(32.0),
child: new Row(
children: [
new Expanded(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
new Container(
padding: const EdgeInsets.only(bottom: 8.0),
child: new Text(
'Oeschinen Lake Campground',
style: new TextStyle(
fontWeight: FontWeight.bold,
),
),
),
new Text(
'Kandersteg, Switzerland',
style: new TextStyle(
color: Colors.grey[500],
),
),
],
),
),
new Icon(
Icons.star,
color: Colors.red[500],
),
new Text('41'),
],
),
);
Column buildButtonColumn(IconData icon, String label) {
Color color = Theme.of(context).primaryColor;
return new Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
new Icon(icon, color: color),
new Container(
margin: const EdgeInsets.only(top: 8.0),
child: new Text(
label,
style: new TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.w400,
color: color,
),
),
),
],
);
}
Widget buttonSection = new Container(
child: new Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
buildButtonColumn(Icons.call, 'CALL'),
buildButtonColumn(Icons.near_me, 'ROUTE'),
buildButtonColumn(Icons.share, 'SHARE'),
],
),
);
Widget textSection = new Container(
padding: const EdgeInsets.all(32.0),
child: new Text(
'''
Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese Alps. Situated 1,578 meters above sea level, it is one of the larger Alpine Lakes. A gondola ride from Kandersteg, followed by a half-hour walk through pastures and pine forest, leads you to the lake, which warms to 20 degrees Celsius in the summer. Activities enjoyed here include rowing, and riding the summer toboggan run.
''',
softWrap: true,
),
);
return new MaterialApp(
title: 'Flutter Demo',
home: new Scaffold(
appBar: new AppBar(
title: new Text('Top Lakes'),
),
body: new ListView(
children: [
new Image.asset(
'images/lake.jpg',
width: 600.0,
height: 240.0,
fit: BoxFit.cover,
),
titleSection,
buttonSection,
textSection,
],
),
),
);
}
}
I am referring to this tutorial https://flutter.io/tutorials/layout/
Also, I want to ask if there are any tools for a clean rebuild in a flutter as I can't find any options for this.
How to include images in your app
1. Create an assets/images folder
This should be located in the root of your project, in the same folder as your pubspec.yaml file.
In Android Studio you can right click in the Project view
You don't have to call it assets or images. You don't even need to make images a subfolder. Whatever name you use, though, is what you will register in the pubspec.yaml file.
2. Add your image to the new folder
You can just copy your image into assets/images. The relative path of lake.jpg, for example, would be assets/images/lake.jpg.
3. Register the assets folder in pubspec.yaml
Open the pubspec.yaml file that is in the root of your project.
Add an assets subsection to the flutter section like this:
flutter:
assets:
- assets/images/lake.jpg
If you have multiple images that you want to include then you can leave off the file name and just use the directory name (include the final /):
flutter:
assets:
- assets/images/
Note: Make sure to use the exact number of spaces. That's 2 spaces per indentation.
4. Use the image in code
Get the asset in an Image widget with Image.asset('assets/images/lake.jpg').
The entire main.dart file is here:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Image from assets"),
),
body: Image.asset('assets/images/lake.jpg'), // <--- image
),
);
}
}
5. Restart your app
When making changes to pubspec.yaml I find that I often need to completely stop my app and restart it again, especially when adding assets. Otherwise I get a crash.
Running the app now you should have something like this:
Further reading
See the documentation for how to do things like provide alternate images for different densities.
Videos
The first video here goes into a lot of detail about how to include images in your app. The second video covers more about how to adjust how they look.
Flutter Tutorial - 1/2 Image - Deep Dive
Flutter Tutorial - 2/2 Image - Deep Dive
I think the error is caused by the redundant ,
flutter:
uses-material-design: true, # <<< redundant , at the end of the line
assets:
- images/lake.jpg
I'd also suggest to create an assets folder in the directory that contains the pubspec.yaml file and move images there and use
flutter:
uses-material-design: true
assets:
- assets/images/lake.jpg
The assets directory will get some additional IDE support that you won't have if you put assets somewhere else.
Create images folder in root level of your project.
Drop your image in this folder, it should look like
Go to your pubspec.yaml file, add assets header and pay close attention to all the spaces.
flutter:
uses-material-design: true
# add this
assets:
- images/profile.jpg
Tap on Packages get at the top right corner of the IDE.
Now you can use your image anywhere using
Image.asset("images/profile.jpg")
The problem is in your pubspec.yaml, here you need to delete the last comma.
uses-material-design: true,
To use image in Flutter. Do these steps.
1. Create a Directory inside assets folder named images. As shown in figure below
2. Put your desired images to images folder.
3. Open pubpsec.yaml file . And add declare your images.Like:--
4. Use this images in your code as.
Card(
elevation: 10,
child: Container(
decoration: BoxDecoration(
color: Colors.orangeAccent,
image: DecorationImage(
image: AssetImage("assets/images/dropbox.png"),
fit: BoxFit.fitWidth,
alignment: Alignment.topCenter,
),
),
child: Text("$index",style: TextStyle(color: Colors.red,fontSize: 16,fontFamily:'LangerReguler')),
alignment: Alignment.center,
),
);
An alternative way to put images in your app (for me it just worked that way):
1 - Create an assets/images folder
2 - Add your image to the new folder
3 - Register the assets folder in pubspec.yaml
4 - Use this code:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
#override
Widget build(BuildContext context) {
var assetsImage = new AssetImage('assets/images/mountain.jpg'); //<- Creates an object that fetches an image.
var image = new Image(image: assetsImage, fit: BoxFit.cover); //<- Creates a widget that displays an image.
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text("Climb your mountain!"),
backgroundColor: Colors.amber[600], //<- background color to combine with the picture :-)
),
body: Container(child: image), //<- place where the image appears
),
);
}
}
Create your assets directory the same as lib level
like this
projectName
-android
-ios
-lib
-assets
-pubspec.yaml
then your pubspec.yaml like
flutter:
assets:
- assets/images/
now you can use Image.asset("/assets/images/")
--> Follow Below Steps One OR Multiple Image Insertion.:
-> Create 'assets/images' folder as in project module.
-> put images which you want.
-> use of image using this syntax. ex.
- Image.asset('assets/images/tony.jpg')
-> use image avatar which you want like, circle, square and much more as your need.
-> Open 'pubspec.yaml' file
-> write the code in 'flutter:' section. ex.
-------------------------------
uses-material-design: true
assets:
- assets/images/ // if multiple images you have then
- assets/images/imagename.extension // if single images you have then
-------------------------------
-> click on 'PUB GET' button which occurs on Right side of Screen above.
-> Run App.
-> if you get any issue then
-> Go to file -> Invalid caches/Restart -> Invalid Caches/Restart button
-> Done.
See Below Images to Get a Better idea of Implementation.
•• Here, add image file like below. ••
•• Here, add image file Description in PUBSPEC.YAML file like below. ••
Done.☻♥
When you adding assets directory in pubspec.yaml file give more attention in to spaces
this is wrong
flutter:
assets:
- assets/images/lake.jpg
This is the correct way,
flutter:
assets:
- assets/images/
their is no need to create asset directory and under it images directory and then you put image.
Better is to just create Images directory inside your project where pubspec.yaml exist and put images inside it
and access that images just like as shown in tutorial/documention
assets:
- images/lake.jpg // inside pubspec.yaml
If the image is inside a package dependency, you should also provide the package name, event if you are referencing the image from the same dependency!
Image.asset("assets/pics/events_empty.png", package: "ui_elements"),
Ref:
Asset images in package dependencies
Make sure you create the assets folder in the main directory, not in the lib folder.
you can rather use this to see access to everything inside assets, because there may be folders like images, logo, icon, etc...
create the assets folder in the root of the project
MyProject
android
assets
ios
lib
test
web
windows
.gitignore
pubspec.yaml
and in your pubspec.yaml, there are
assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
replace the last two lines by the 'assets/' to be able to directly access everything inside assets
if you have directly images in assets
assets:
- assets/
or if you have sub folders in assets
assets:
- assets/folder1/
- assets/folder2/
- assets/folder3/
Create an assets/images folder and Add your image to the folder
Register the assets folder in pubspec.yaml
flutter:
assets:
- assets/images/placeholder_circle_image.png
If you have multiple images
flutter:
assets:
- assets/images/
Use the image in code
Image.asset(
'assets/images/item_entry/add_car_video.png',
width: 100,
height: 100,
fit: BoxFit.cover,
cacheWidth:100 * MediaQuery.of(context).devicePixelRatio.round(),
),
Error when comma is at the end of below line
uses-material-design: true,
when the line after assets: indent is not correct it throws below error
If the indent is corrected as shown in below, then error is fixed.
If the asset file is not added then it highlights that with yellowish background but Pub get doesn't throw error but there will be an error during installation.
In short, Code Indent and syntax is important
You can create a folder and reference it as shown