twicpics_components 0.3.0 twicpics_components: ^0.3.0 copied to clipboard
A library that brings the power of TwicPics to your flutter applications.
TwicPics Flutter Widget Samples #
How to install #
Add the twicpics_components
package to your Flutter
project by running:
$ flutter pub add twicpics_components
How to setup #
// main.dart
import 'package:twicpics_components/twicpics_components.dart';
void main() {
install(
domain: "https://<your-domain>.twic.pics/",
);
runApp(...);
}
If you don't already have a TwicPics domain, you can easily create your own TwicPics account for free.
How to use #
TwicImg
and TwicVideo
come as Flutter Widgets
and are used as such.
Basic usage #
Remember, the widgets do not expose height nor width properties.
The image or video occupies the whole width of its container.
Its height is determined according to the desired ratio
.
The default ratio is 1 (which generates a square variant of your master asset).
This will display a smart cropped image with an aspect-ratio of 1:
// my_widget.dart
import 'package:twicpics_components/twicpics_components.dart';
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image',
);
}
}
This will display a smart cropped video with an aspect-ratio of 1:
// my_widget.dart
import 'package:twicpics_components/twicpics_components.dart';
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicVideo(
src: 'path/to/my/video',
);
}
}
Bulk loading #
When embedding TwicImg
or TwicVideo
in a lazily loading-compatible tree, it is recommended to disable lazy-loading feature:
// my_widget.dart
class GridSample extends StatelessWidget {
const GridSample({super.key});
@override
Widget build(BuildContext context) {
return GridView.count(
primary: false,
crossAxisCount: 3,
children: [
TwicImg(
src: 'path/to/my/image',
eager: true,
),
TwicVideo(
src: 'path/to/my/video',
eager: true,
),
// ...
]
);
}
}
Choose your focus #
You can control the crop function by using the focus
property.
Read more about focus.
Set the focus point to coordinates
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image',
focus: '30px40p', // this will set the focus point coordinates using relative lengths
);
}
}
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image',
focus: '345x678', // this will set the focus point coordinates using absolute lengths
);
}
}
Set the focus automagically
This is only available for TwicImg
.
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image',
focus: 'auto', // the focus point will be chosen automagically for you
);
}
}
Display a landscape asset #
Setting a value to ratio
property changes the aspect-ratio of the generated and displayed asset.
This will display a smart cropped variant of your master image with an aspect-ratio of 4/3.
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image', // your master image file
ratio: '4/3',
);
}
}
This will display a smart cropped variant of your master video with an aspect-ratio of 4/3.
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicVideo(
src: 'path/to/my/video', // your master video file
ratio: '4/3',
);
}
}
Display a portrait asset #
This will display a smart cropped variant of your master image with an aspect-ratio of 3/4.
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image', // your master image file
ratio: '3/4',
);
}
}
This will display a smart cropped variant of your master video with an aspect-ratio of 3/4.
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicVideo(
src: 'path/to/my/video', // your master video file
ratio: '3/4',
);
}
}
Working with ratio="none" #
Allows to display both image or video with a free height while respecting its natural aspect-ratio.
Hero image
An image that occupies all available space:
// my_widget.dart
import 'package:flutter/material.dart';
import 'package:twicpics_components/twicpics_components.dart';
class HeroSample extends StatelessWidget {
const HeroSample({super.key});
@override
Widget build(BuildContext context) {
return SizedBox(
width: double.infinity,
child: TwicImg(
src: 'path/to/my/image.jpg',
ratio: 'none',
),
);
}
}
Hero video
An video that occupies all available space:
// my_widget.dart
import 'package:flutter/material.dart';
import 'package:twicpics_components/twicpics_components.dart';
class HeroSample extends StatelessWidget {
const HeroSample({super.key});
@override
Widget build(BuildContext context) {
return SizedBox(
width: double.infinity,
child: TwicVideo(
src: 'path/to/my/video.jpg',
ratio: 'none',
),
);
}
}
Hero banner
You can specify the height of your image (or video) while respecting its natural aspect-ratio and optimizing your Cumulative Layout Shift (CLS) metric.
// my_widget.dart
import 'package:flutter/material.dart';
import 'package:twicpics_components/twicpics_components.dart';
class HeroBanner extends StatelessWidget {
const HeroBanner({super.key});
@override
Widget build(BuildContext context) {
return SizedBox(
width: double.infinity,
height: 200,
child: TwicImg(
src: 'path/to/my/image.jpg',
ratio: 'none',
),
);
}
}
Reframe your image #
The TwicImg
widget allows to reframe your image on the main subject(s) it contains.
In cover mode
, the resulting image will respect ratio
while maximizing the area occupied by the main subject(s).
In contain mode
, the image will be cropped as close as possible to the main subject(s).
To activate automatic cropping, simply add the refit
property to your widget call.
Read more about refit.
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
anchor: TwicPosition.right, // will align main subject(s) with the right border
src: 'path/to/my/image',
mode: TwicMode.cover, // will maximize the area occupied by the main subject(s) in a squared area
refit: '10p', // will add a 10% padding around the main subject(s)
);
}
}
// my_widget.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image',
mode: TwicMode.contain, // will crop the image as close as possible to main subject(s)
refit: true, // default refit without any padding
);
}
}
refit
is available only for TwicImg
widget.
Working with Row Widget #
When using Row Widget you have to constrain available width for TwicImg
or TwicVideo
as in:
import 'package:flutter/material.dart';
import 'package:twicpics_components/twicpics_components.dart';
class RowSample extends StatelessWidget {
const RowSample({super.key});
@override
Widget build(BuildContext context) {
return Row(
children: [
SizedBox(
width: 100, //fixed width
child: TwicImg(
src:'path/to/my/image',
),
),
Expanded( // makes child fills the available space
child: TwicVideo(
src:'path/to/my/video',
),
),
],
);
}
}
Using TwicPics transformations #
You can access TwicPics Transformation through preTransform
property.
This will display a variant of your master image for which background has been removed using artificial intelligence:
// grid_sample.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicImg(
src: 'path/to/my/image',
preTransform: 'background=remove',
);
}
}
Displaying Optimal Segment from your Videos #
The TwicVideo
widget allows you to select the displayed part of your master video file.
The properties of the TwicVideo
that allow such selection are :
from
: moves the starting point of the videoto
: moves the end point of the videoduration
: limits the duration of the video
Expected values for these props are expressed in seconds and must be positive.
// grid_sample.dart
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return TwicVideo(
src: 'path/to/my/video',
from: '3' /* start playing the video at the 3rd second */
to:'10.5' /* end at 10.5 seconds */
);
}
}
Read more about video slicing.
Questions and feedback #
Fell free to submit an issue or to ask us anything by dropping an email at support@twic.pics.