Flutter ਨੇ ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਇੱਕ ਸਿੰਗਲ ਕੋਡਬੇਸ ਤੋਂ ਮੋਬਾਈਲ, ਵੈੱਬ, ਅਤੇ ਡੈਸਕਟੌਪ ਲਈ ਸੁੰਦਰ, ਮੂਲ ਰੂਪ ਵਿੱਚ ਕੰਪਾਇਲ ਕੀਤੀਆਂ ਐਪਲੀਕੇਸ਼ਨਾਂ ਬਣਾਉਣ ਦੇ ਯੋਗ ਬਣਾ ਕੇ ਮੋਬਾਈਲ ਡਿਵੈਲਪਮੈਂਟ ਲੈਂਡਸਕੇਪ ਨੂੰ ਬਦਲ ਦਿੱਤਾ ਹੈ। ਇਸਦੀ ਅਮੀਰ ਵਿਜੇਟ ਲਾਇਬ੍ਰੇਰੀ, ਐਕਸਪ੍ਰੈਸਿਵ UI ਫਰੇਮਵਰਕ, ਅਤੇ ਪ੍ਰਸਿੱਧ ਹੌਟ ਰੀਲੋਡ ਵਿਸ਼ੇਸ਼ਤਾ ਦੇ ਨਾਲ, Flutter ਟੀਮਾਂ ਨੂੰ ਤੇਜ਼ੀ ਨਾਲ ਦੁਹਰਾਉਣ ਅਤੇ ਰਿਕਾਰਡ ਸਮੇਂ ਵਿੱਚ ਪਾਲਿਸ਼ਡ ਯੂਜ਼ਰ ਇੰਟਰਫੇਸ ਪ੍ਰਦਾਨ ਕਰਨ ਲਈ ਸ਼ਕਤੀ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।
ਇਸ ਵਿਆਪਕ ਗਾਈਡ ਵਿੱਚ, ਅਸੀਂ ਉਹਨਾਂ ਮੂਲ ਧਾਰਨਾਵਾਂ ਦੀ ਪੜਚੋਲ ਕਰਾਂਗੇ ਜੋ Flutter ਨੂੰ ਤੇਜ਼ ਮੋਬਾਈਲ UI ਵਿਕਾਸ ਲਈ ਇੱਕ ਬੇਮਿਸਾਲ ਵਿਕਲਪ ਬਣਾਉਂਦੇ ਹਨ, ਵਿਜੇਟ ਟ੍ਰੀ ਨੂੰ ਸਮਝਣ ਤੋਂ ਲੈ ਕੇ ਗੁੰਝਲਦਾਰ ਐਨੀਮੇਸ਼ਨਾਂ ਅਤੇ ਜਵਾਬਦੇਹ ਲੇਆਉਟਸ ਨੂੰ ਲਾਗੂ ਕਰਨ ਤੱਕ।
Flutter ਵਿਜੇਟ ਟ੍ਰੀ ਨੂੰ ਸਮਝਣਾ
Flutter ਵਿੱਚ ਹਰ ਚੀਜ਼ ਇੱਕ ਵਿਜੇਟ ਹੈ। ਪੂਰੀ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਵਿਜੇਟਸ ਦੇ ਇੱਕ ਰੁੱਖ ਦੇ ਰੂਪ ਵਿੱਚ ਬਣਾਇਆ ਗਿਆ ਹੈ, ਜਿੱਥੇ ਹਰੇਕ ਵਿਜੇਟ ਉਪਭੋਗਤਾ ਇੰਟਰਫੇਸ ਦੇ ਇੱਕ ਹਿੱਸੇ ਦਾ ਵਰਣਨ ਕਰਦਾ ਹੈ। ਇਸ ਘੋਸ਼ਣਾਤਮਕ ਪਹੁੰਚ ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਵਰਣਨ ਕਰਦੇ ਹੋ ਕਿ ਦਿੱਤੀ ਗਈ ਸਥਿਤੀ ਲਈ UI ਕਿਹੋ ਜਿਹਾ ਦਿਖਾਈ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ Flutter ਰਾਜ ਦੇ ਬਦਲਣ 'ਤੇ ਰੈਂਡਰਿੰਗ ਨੂੰ ਅਪਡੇਟ ਕਰਨ ਦਾ ਧਿਆਨ ਰੱਖਦਾ ਹੈ।
XTAG54 XTAG5 ਆਰਚੀਕਲ ਟ੍ਰੀ ਹੈ। ਸਿਖਰ 'ਤੇ ਤੁਹਾਡਾMaterialAppਜਾਂCupertinoAppਬੈਠਦਾ ਹੈ, ਜੋ ਥੀਮਿੰਗ ਅਤੇ ਨੈਵੀਗੇਸ਼ਨ ਸਕੈਫੋਲਡਿੰਗ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। ਇਸਦੇ ਹੇਠਾਂ, ਤੁਸੀਂ ਆਪਣੇ UI ਨੂੰ ਛੋਟੇ, ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਵਿਜੇਟਸ ਤੋਂ ਬਣਾਉਂਦੇ ਹੋ। ਇਸ ਲੜੀ ਨੂੰ ਸਮਝਣਾ ਕੁਸ਼ਲ Flutter ਐਪਲੀਕੇਸ਼ਨਾਂ ਨੂੰ ਬਣਾਉਣ ਲਈ ਬੁਨਿਆਦੀ ਹੈ।import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My Flutter App',
theme: ThemeData(
colorSchemeSeed: Colors.blue,
useMaterial3: true,
),
home: const HomeScreen(),
);
}
}ਰੁੱਖ ਵਿੱਚ ਹਰੇਕ ਵਿਜੇਟ ਵਿੱਚ ਇੱਕ ਅਨੁਸਾਰੀElementਹੈ ਜੋ ਰੁੱਖ ਵਿੱਚ ਉਸਦੀ ਸਥਿਤੀ ਨੂੰ ਦਰਸਾਉਂਦਾ ਹੈ ਅਤੇ ਇੱਕRenderObjectਜੋ ਲੇਆਉਟ ਅਤੇ ਪੇਂਟਿੰਗ ਨੂੰ ਸੰਭਾਲਦਾ ਹੈ। Flutter ਦੀ ਰੈਂਡਰਿੰਗ ਪਾਈਪਲਾਈਨ ਘੱਟੋ-ਘੱਟ ਅੱਪਡੇਟਾਂ ਨੂੰ ਨਿਰਧਾਰਤ ਕਰਨ ਲਈ ਵਿਜੇਟ ਟ੍ਰੀ ਨੂੰ ਕੁਸ਼ਲਤਾ ਨਾਲ ਵੱਖ ਕਰਦੀ ਹੈ, ਵਾਰ-ਵਾਰ ਪੁਨਰ-ਨਿਰਮਾਣ ਦੇ ਨਾਲ ਵੀ ਤੁਹਾਡੇ UI ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਕਾਇਮ ਰੱਖਦੇ ਹੋਏ।
ਸਟੇਟਲੈੱਸ ਬਨਾਮ ਸਟੇਟਫੁੱਲ ਵਿਜੇਟਸ
Flutter ਦੋ ਬੁਨਿਆਦੀ ਵਿਜੇਟ ਕਿਸਮਾਂ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਆਰਕੀਟੈਕਚਰ ਵਿੱਚ ਵੱਖ-ਵੱਖ ਉਦੇਸ਼ਾਂ ਦੀ ਪੂਰਤੀ ਕਰਦੇ ਹਨ।
ਸਟੇਟਲੈੱਸ ਵਿਜੇਟ
AStatelessWidgetਅਟੱਲ ਹੈ। ਇੱਕ ਵਾਰ ਬਣ ਜਾਣ ਤੋਂ ਬਾਅਦ, ਇਹ ਆਪਣੀ ਅੰਦਰੂਨੀ ਸਥਿਤੀ ਨੂੰ ਨਹੀਂ ਬਦਲ ਸਕਦਾ। ਇਹ ਵਿਜੇਟਸ ਉਹਨਾਂ UI ਤੱਤਾਂ ਲਈ ਆਦਰਸ਼ ਹਨ ਜੋ ਸਿਰਫ਼ ਉਹਨਾਂ ਨੂੰ ਦਿੱਤੇ ਗਏ ਸੰਰਚਨਾ ਅਤੇ ਉਹਨਾਂ ਦੇ ਉੱਪਰ ਟਰੀ ਵਿੱਚ ਵਿਰਾਸਤ ਵਿੱਚ ਮਿਲੇ ਵਿਜੇਟਸ 'ਤੇ ਨਿਰਭਰ ਕਰਦੇ ਹਨ। ਉਹ ਹਲਕੇ ਹਨ, ਟੈਸਟ ਕਰਨ ਵਿੱਚ ਆਸਾਨ ਹਨ, ਅਤੇ ਤੁਹਾਡੀ ਡਿਫੌਲਟ ਚੋਣ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ।
class UserCard extends StatelessWidget {
final String name;
final String email;
final String avatarUrl;
const UserCard({
super.key,
required this.name,
required this.email,
required this.avatarUrl,
});
@override
Widget build(BuildContext context) {
return Card(
elevation: 2,
child: ListTile(
leading: CircleAvatar(
backgroundImage: NetworkImage(avatarUrl),
),
title: Text(name),
subtitle: Text(email),
trailing: const Icon(Icons.arrow_forward_ios),
),
);
}
}ਸਟੇਟਫੁਲ ਵਿਜੇਟ
AStatefulWidgetਪਰਿਵਰਤਨਸ਼ੀਲ ਸਥਿਤੀ ਨੂੰ ਕਾਇਮ ਰੱਖਦਾ ਹੈ ਜੋ ਵਿਜੇਟ ਦੇ ਜੀਵਨ ਕਾਲ ਦੌਰਾਨ ਬਦਲ ਸਕਦਾ ਹੈ। ਜਦੋਂsetState()ਰਾਹੀਂ ਸਥਿਤੀ ਬਦਲਦੀ ਹੈ, ਤਾਂ Flutter ਨਵੀਂ ਸਥਿਤੀ ਨੂੰ ਦਰਸਾਉਣ ਲਈ ਵਿਜੇਟ ਦਾ ਮੁੜ ਨਿਰਮਾਣ ਕਰਦਾ ਹੈ। ਫਾਰਮ, ਟੌਗਲ ਅਤੇ ਐਨੀਮੇਟਡ ਕੰਪੋਨੈਂਟਸ ਵਰਗੇ ਇੰਟਰਐਕਟਿਵ ਤੱਤਾਂ ਲਈ ਸਟੇਟਫੁੱਲ ਵਿਜੇਟਸ ਦੀ ਵਰਤੋਂ ਕਰੋ।
class CounterWidget extends StatefulWidget {
const CounterWidget({super.key});
@override
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _count = 0;
void _increment() {
setState(() {
_count++;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Count: $_count', style: Theme.of(context).textTheme.headlineMedium),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _increment,
child: const Text('Increment'),
),
],
);
}
}ਲੇਆਉਟ ਸਿਸਟਮ: ਰੋ, ਕਾਲਮ, ਸਟੈਕ, ਅਤੇ ਫਲੈਕਸ
Flutter ਦਾ ਲੇਆਉਟ ਸਿਸਟਮ ਫਲੈਕਸ-ਆਧਾਰਿਤ ਵਿਜੇਟਸ ਦੇ ਇੱਕ ਸ਼ਕਤੀਸ਼ਾਲੀ ਸੈੱਟ 'ਤੇ ਬਣਾਇਆ ਗਿਆ ਹੈ ਜੋ ਤੁਹਾਨੂੰ ਸਕਰੀਨ 'ਤੇ ਐਲੀਮੈਂਟਸ ਨੂੰ ਕਿਵੇਂ ਵਿਵਸਥਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਇਸ 'ਤੇ ਸਹੀ ਨਿਯੰਤਰਣ ਦਿੰਦੇ ਹਨ।
ਕਤਾਰ ਅਤੇ ਕਾਲਮ
Rowਬੱਚਿਆਂ ਨੂੰ ਖਿਤਿਜੀ ਵਿਵਸਥਿਤ ਕਰਦਾ ਹੈ, ਜਦੋਂ ਕਿColumnਉਹਨਾਂ ਨੂੰ ਲੰਬਕਾਰੀ ਰੂਪ ਵਿੱਚ ਵਿਵਸਥਿਤ ਕਰਦਾ ਹੈ। ਦੋਵੇਂ ਮੁੱਖ ਧੁਰੇ ਅਤੇ ਕਰਾਸ ਧੁਰੇ ਦੇ ਨਾਲ ਇਕਸਾਰਤਾ ਦਾ ਸਮਰਥਨ ਕਰਦੇ ਹਨ, ਅਤੇExpandedਅਤੇFlexibleਵਿਜੇਟਸ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਬੱਚਿਆਂ ਵਿੱਚ ਸਪੇਸ ਵੰਡ ਸਕਦੇ ਹਨ।
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(
flex: 2,
child: Text('Title', style: Theme.of(context).textTheme.titleLarge),
),
Expanded(
flex: 1,
child: ElevatedButton(
onPressed: () {},
child: const Text('Action'),
),
),
],
)ਸਟੈਕ
Stackਤੁਹਾਨੂੰ ਇੱਕ ਦੂਜੇ ਦੇ ਉੱਪਰ ਵਿਜੇਟਸ ਨੂੰ ਓਵਰਲੇ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੰਦਾ ਹੈ। ਇਹ ਚਿੱਤਰ ਓਵਰਲੇ, ਬੈਜ ਅਤੇ ਫਲੋਟਿੰਗ ਐਕਸ਼ਨ ਐਲੀਮੈਂਟਸ ਵਰਗੀਆਂ ਗੁੰਝਲਦਾਰ ਵਿਜ਼ੂਅਲ ਰਚਨਾਵਾਂ ਬਣਾਉਣ ਲਈ ਅਨਮੋਲ ਹੈ। ਬੱਚਿਆਂ ਨੂੰ ਸਟੈਕ ਦੇ ਅੰਦਰ ਖਾਸ ਸਥਾਨਾਂ 'ਤੇ ਰੱਖਣ ਲਈPositionedਦੀ ਵਰਤੋਂ ਕਰੋ।
Stack(
children: [
Image.asset('assets/background.jpg', fit: BoxFit.cover),
Positioned(
bottom: 16,
left: 16,
right: 16,
child: Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.black54,
borderRadius: BorderRadius.circular(8),
),
child: const Text(
'Overlay Text',
style: TextStyle(color: Colors.white, fontSize: 18),
),
),
),
],
)ਲਚਕਦਾਰ ਖਾਕਾ ਪੈਟਰਨ
Expanded,Flexible, ਅਤੇSpacerਨੂੰ ਸੰਯੋਜਿਤ ਕਰੋ ਤਾਂ ਜੋ ਉਪਲਬਧ ਸਪੇਸ ਦੇ ਅਨੁਕੂਲ ਲੇਆਉਟ ਬਣਾਇਆ ਜਾ ਸਕੇ।Expandedਬੱਚੇ ਨੂੰ ਬਾਕੀ ਬਚੀ ਥਾਂ ਭਰਨ ਲਈ ਮਜ਼ਬੂਰ ਕਰਦਾ ਹੈ, ਜਦੋਂ ਕਿFlexibleਬੱਚੇ ਨੂੰ ਇਸਦੇ ਨਿਰਧਾਰਤ ਫਲੈਕਸ ਫੈਕਟਰ ਤੋਂ ਛੋਟਾ ਹੋਣ ਦਿੰਦਾ ਹੈ।
MediaQuery ਅਤੇ LayoutBuilder ਦੇ ਨਾਲ ਜਵਾਬਦੇਹ ਡਿਜ਼ਾਈਨ
ਬਿਲਡਿੰਗ ਜਵਾਬਦੇਹ UIs ਜੋ ਫ਼ੋਨਾਂ, ਟੈਬਲੇਟਾਂ, ਅਤੇ ਇੱਥੋਂ ਤੱਕ ਕਿ ਡੈਸਕਟਾਪ ਵਿੱਚ ਵੀ ਕੰਮ ਕਰਦੇ ਹਨ, ਲਈ Flutter ਦੇ ਜਵਾਬਦੇਹ ਡਿਜ਼ਾਈਨ ਟੂਲਸ ਨੂੰ ਸਮਝਣ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।
MediaQueryਮੌਜੂਦਾ ਡਿਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਸਕ੍ਰੀਨ ਦਾ ਆਕਾਰ, ਸਥਿਤੀ, ਪਿਕਸਲ ਘਣਤਾ, ਅਤੇ ਸਿਸਟਮ ਤਰਜੀਹਾਂ ਸ਼ਾਮਲ ਹਨ। ਉਪਲਬਧ ਸਪੇਸ ਦੇ ਆਧਾਰ 'ਤੇ ਲੇਆਉਟ ਫੈਸਲੇ ਲੈਣ ਲਈ ਇਸਦੀ ਵਰਤੋਂ ਕਰੋ।
class ResponsiveLayout extends StatelessWidget {
const ResponsiveLayout({super.key});
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
final isTablet = screenWidth > 600;
final isDesktop = screenWidth > 1200;
return Scaffold(
body: isDesktop
? Row(
children: [
const NavigationRail(destinations: []),
Expanded(child: _buildContent(crossAxisCount: 4)),
],
)
: _buildContent(crossAxisCount: isTablet ? 3 : 2),
);
}
Widget _buildContent({required int crossAxisCount}) {
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: crossAxisCount,
crossAxisSpacing: 16,
mainAxisSpacing: 16,
),
itemCount: 20,
itemBuilder: (context, index) => Card(
child: Center(child: Text('Item $index')),
),
);
}
}LayoutBuilderਇੱਕ ਹੋਰ ਸ਼ਕਤੀਸ਼ਾਲੀ ਟੂਲ ਹੈ ਜੋ ਪੇਰੈਂਟ ਵਿਜੇਟ ਦੀਆਂ ਰੁਕਾਵਟਾਂ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਤੁਸੀਂ ਪੂਰੀ ਸਕਰੀਨ ਦੇ ਮਾਪਾਂ ਦੀ ਬਜਾਏ ਅਸਲ ਉਪਲਬਧ ਸਪੇਸ ਦੇ ਆਧਾਰ 'ਤੇ ਵੱਖ-ਵੱਖ ਖਾਕੇ ਬਣਾ ਸਕਦੇ ਹੋ। ਇਹ ਵਿਸ਼ੇਸ਼ ਤੌਰ 'ਤੇ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਭਾਗਾਂ ਲਈ ਲਾਭਦਾਇਕ ਹੈ ਜਿਨ੍ਹਾਂ ਨੂੰ ਆਪਣੇ ਕੰਟੇਨਰ ਦੇ ਅਨੁਕੂਲ ਹੋਣ ਦੀ ਲੋੜ ਹੈ।
ਥੀਮਿੰਗ ਅਤੇ ਮਟੀਰੀਅਲ ਡਿਜ਼ਾਈਨ 3
Flutter ਦਾ ਥੀਮਿੰਗ ਸਿਸਟਮ ਤੁਹਾਨੂੰ ਤੁਹਾਡੀ ਪੂਰੀ ਐਪਲੀਕੇਸ਼ਨ ਵਿੱਚ ਇਕਸਾਰ ਵਿਜ਼ੂਅਲ ਭਾਸ਼ਾ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਮੈਟੀਰੀਅਲ ਡਿਜ਼ਾਈਨ 3 ਦੇ ਨਾਲ, ਤੁਸੀਂ ਇੱਕ ਬੀਜ ਰੰਗ ਤੋਂ ਇੱਕ ਪੂਰੀ ਰੰਗ ਸਕੀਮ ਤਿਆਰ ਕਰ ਸਕਦੇ ਹੋ।
MaterialApp(
theme: ThemeData(
colorSchemeSeed: const Color(0xFF1A73E8),
useMaterial3: true,
textTheme: const TextTheme(
headlineLarge: TextStyle(fontWeight: FontWeight.bold),
bodyLarge: TextStyle(fontSize: 16, height: 1.5),
),
cardTheme: CardTheme(
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
side: BorderSide(color: Colors.grey.shade200),
),
),
inputDecorationTheme: InputDecorationTheme(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8),
),
filled: true,
),
),
)Theme.of(context)ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਆਪਣੇ ਵਿਜੇਟ ਟ੍ਰੀ ਵਿੱਚ ਕਿਤੇ ਵੀ ਥੀਮ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਐਕਸੈਸ ਕਰੋ। ਇਹ ਵਿਜ਼ੂਅਲ ਇਕਸਾਰਤਾ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਅਤੇ ਤੁਹਾਡੇMaterialAppਨੂੰ ਇੱਕ ਵਿਕਲਪਿਕdarkThemeਪ੍ਰਦਾਨ ਕਰਕੇ ਡਾਰਕ ਮੋਡ ਨੂੰ ਲਾਗੂ ਕਰਨਾ ਮਾਮੂਲੀ ਬਣਾਉਂਦਾ ਹੈ।
ਐਨੀਮੇਸ਼ਨ ਅਤੇ ਪਰਿਵਰਤਨ
Flutter ਨਿਰਵਿਘਨ, ਪ੍ਰਦਰਸ਼ਨਕਾਰੀ ਐਨੀਮੇਸ਼ਨਾਂ 'ਤੇ ਉੱਤਮ ਹੈ। ਫਰੇਮਵਰਕ ਵੱਖ-ਵੱਖ ਜਟਿਲਤਾ ਪੱਧਰਾਂ ਦੇ ਅਨੁਕੂਲ ਹੋਣ ਲਈ ਅਪ੍ਰਤੱਖ ਅਤੇ ਸਪੱਸ਼ਟ ਐਨੀਮੇਸ਼ਨ APIs ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।
ਅਪ੍ਰਤੱਖ ਐਨੀਮੇਸ਼ਨਾਂ
ਸਧਾਰਣ ਸੰਪੱਤੀ ਤਬਦੀਲੀਆਂ ਲਈ, ਅਪ੍ਰਤੱਖ ਐਨੀਮੇਸ਼ਨ ਆਪਣੇ ਆਪ ਪੁਰਾਣੇ ਅਤੇ ਨਵੇਂ ਮੁੱਲਾਂ ਵਿਚਕਾਰ ਐਨੀਮੇਟ ਹੋ ਜਾਂਦੇ ਹਨ।AnimatedContainer,AnimatedOpacity, ਅਤੇAnimatedPaddingਵਰਗੇ ਵਿਜੇਟਸ ਨੂੰ ਘੱਟੋ-ਘੱਟ ਕੋਡ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ।
AnimatedContainer(
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
width: _isExpanded ? 300 : 150,
height: _isExpanded ? 200 : 100,
decoration: BoxDecoration(
color: _isExpanded ? Colors.blue : Colors.green,
borderRadius: BorderRadius.circular(_isExpanded ? 16 : 8),
),
child: const Center(child: Text('Tap me')),
)ਸਪੱਸ਼ਟ ਐਨੀਮੇਸ਼ਨ
ਹੋਰ ਨਿਯੰਤਰਣ ਲਈ,Tweenਵਸਤੂਆਂ ਦੇ ਨਾਲAnimationControllerਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਨੂੰ ਸਮੇਂ, ਕ੍ਰਮ, ਅਤੇ ਐਨੀਮੇਸ਼ਨ ਕਰਵ 'ਤੇ ਵਧੀਆ ਨਿਯੰਤਰਣ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ।
class PulseAnimation extends StatefulWidget {
const PulseAnimation({super.key});
@override
State<PulseAnimation> createState() => _PulseAnimationState();
}
class _PulseAnimationState extends State<PulseAnimation>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _scaleAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 1),
vsync: this,
)..repeat(reverse: true);
_scaleAnimation = Tween<double>(begin: 0.95, end: 1.05).animate(
CurvedAnimation(parent: _controller, curve: Curves.easeInOut),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ScaleTransition(
scale: _scaleAnimation,
child: const FlutterLogo(size: 100),
);
}
}ਪੰਨਾ ਪਰਿਵਰਤਨ
ਖਾਸ ਸਕ੍ਰੀਨ ਪਰਿਵਰਤਨ ਬਣਾਉਣ ਲਈPageRouteBuilderਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ ਨੇਵੀਗੇਸ਼ਨ ਪਰਿਵਰਤਨ ਨੂੰ ਅਨੁਕੂਲਿਤ ਕਰੋ ਜੋ ਤੁਹਾਡੀ ਐਪ ਦੀ ਸ਼ਖਸੀਅਤ ਨੂੰ ਵਧਾਉਂਦੇ ਹਨ।
ਹੌਟ ਰੀਲੋਡ ਵਰਕਫਲੋ
Flutter ਦਾ ਹੌਟ ਰੀਲੋਡ ਵਿਕਾਸ ਦੀ ਗਤੀ ਲਈ ਇੱਕ ਗੇਮ-ਚੇਂਜਰ ਹੈ। ਜਦੋਂ ਤੁਸੀਂ ਇੱਕ ਫਾਈਲ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰਦੇ ਹੋ, ਤਾਂ Flutter ਤੁਹਾਡੇ ਐਪ ਦੀ ਮੌਜੂਦਾ ਸਥਿਤੀ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਦੇ ਹੋਏ, ਚੱਲ ਰਹੇ ਡਾਰਟ VM ਵਿੱਚ ਅੱਪਡੇਟ ਕੀਤੇ ਸਰੋਤ ਕੋਡ ਨੂੰ ਇੰਜੈਕਟ ਕਰਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਤੁਸੀਂ ਇੱਕ ਵਿਜੇਟ ਦੀ ਪੈਡਿੰਗ ਨੂੰ ਟਵੀਕ ਕਰ ਸਕਦੇ ਹੋ, ਇੱਕ ਰੰਗ ਬਦਲ ਸਕਦੇ ਹੋ, ਜਾਂ ਇੱਕ ਲੇਆਉਟ ਦਾ ਪੁਨਰਗਠਨ ਕਰ ਸਕਦੇ ਹੋ ਅਤੇ ਇੱਕ ਸਕਿੰਟ ਦੇ ਅੰਦਰ ਨਤੀਜੇ ਦੇਖ ਸਕਦੇ ਹੋ।
ਹੌਟ ਰੀਲੋਡ ਪ੍ਰਭਾਵ ਨੂੰ ਵੱਧ ਤੋਂ ਵੱਧ ਕਰਨ ਲਈ, ਇਹਨਾਂ ਵਧੀਆ ਅਭਿਆਸਾਂ ਦੀ ਪਾਲਣਾ ਕਰੋ: X
constਵਜੋਂ ਚਿੰਨ੍ਹਿਤ ਕਰੋ। ਇਹ Flutter ਦੀ ਪਛਾਣ ਕਰਨ ਵਿੱਚ ਮਦਦ ਕਰਦਾ ਹੈ ਕਿ ਦਰਖਤ ਦੇ ਕਿਹੜੇ ਹਿੱਸਿਆਂ ਨੂੰ ਦੁਬਾਰਾ ਬਣਾਉਣ ਦੀ ਲੋੜ ਹੈ ਅਤੇ ਕਾਰਗੁਜ਼ਾਰੀ ਵਿੱਚ ਸੁਧਾਰ ਹੁੰਦਾ ਹੈ।Flutter UI
ਲਈ ਪ੍ਰਦਰਸ਼ਨ ਸੁਝਾਅ ਤੇਜ਼ UI ਬਣਾਉਣ ਲਈ ਕਈ ਮੁੱਖ ਖੇਤਰਾਂ 'ਤੇ ਧਿਆਨ ਦੇਣ ਦੀ ਲੋੜ ਹੈ:
1. ਕੰਸਟ ਵਿਜੇਟਸ ਦੀ ਵਰਤੋਂ ਕਰੋ
ਨੂੰ
ਵਿਜੇਟਸ ਨੂੰ ਐਕਸਪੀਆਰਐਕਸਐਕਸ ਦੇ ਤੌਰ 'ਤੇ ਘੋਸ਼ਿਤ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ। ਪੂਰੀ ਤਰ੍ਹਾਂ ਮੁੜ ਨਿਰਮਾਣ ਨੂੰ ਛੱਡੋ। ਇਹ ਸਭ ਤੋਂ ਸਰਲ ਅਤੇ ਸਭ ਤੋਂ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਅਨੁਕੂਲਤਾਵਾਂ ਵਿੱਚੋਂ ਇੱਕ ਹੈ।
2. ਰੀਬਿਲਡ ਸਕੋਪ ਨੂੰ ਛੋਟਾ ਕਰੋ
setState()ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਸਮੇਂ, ਸਿਰਫ਼ ਕਾਲਿੰਗ ਵਿਜੇਟ ਅਤੇ ਇਸਦੇ ਉੱਤਰਾਧਿਕਾਰੀ ਹੀ ਮੁੜ ਨਿਰਮਾਣ ਕਰਦੇ ਹਨ। ਰਾਜ ਦੀਆਂ ਤਬਦੀਲੀਆਂ ਦੇ ਧਮਾਕੇ ਦੇ ਘੇਰੇ ਨੂੰ ਸੀਮਤ ਕਰਨ ਲਈ ਆਪਣੇ ਰਾਜਪੂਰਨ ਵਿਜੇਟਸ ਨੂੰ ਛੋਟੇ ਅਤੇ ਕੇਂਦ੍ਰਿਤ ਰੱਖੋ।
3. ਲੰਬੀਆਂ ਸੂਚੀਆਂ ਲਈ ListView.builder ਦੀ ਵਰਤੋਂ ਕਰੋ
ਕਦੇ ਵੀ ਵੱਡੇ ਡੇਟਾਸੈਟਾਂ ਲਈ ਬੱਚਿਆਂ ਦੀ ਸਥਿਰ ਸੂਚੀ ਦੇ ਨਾਲListViewਦੀ ਵਰਤੋਂ ਨਾ ਕਰੋ। ਇਸਦੀ ਬਜਾਏ,ListView.builderਦੀ ਵਰਤੋਂ ਕਰੋ ਜੋ ਆਲਸ ਨਾਲ ਆਈਟਮਾਂ ਨੂੰ ਬਣਾਉਂਦੇ ਹਨ ਜਦੋਂ ਉਹ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਸਕ੍ਰੋਲ ਕਰਦੇ ਹਨ, ਨਾਟਕੀ ਢੰਗ ਨਾਲ ਮੈਮੋਰੀ ਵਰਤੋਂ ਨੂੰ ਘਟਾਉਂਦੇ ਹਨ।
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].title),
subtitle: Text(items[index].description),
);
},
)4. ਕੈਸ਼ ਮਹਿੰਗੇ ਗਣਨਾ
ਸਥਿਰ ਭਾਗਾਂ ਤੋਂ UI ਦੇ ਅਕਸਰ ਬਦਲਦੇ ਹਿੱਸਿਆਂ ਨੂੰ ਵੱਖ ਕਰਨ ਲਈRepaintBoundaryਵਿਜੇਟ ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਸਥਿਰ ਸਮੱਗਰੀ ਦੇ ਬੇਲੋੜੇ ਰੰਗਾਂ ਨੂੰ ਰੋਕਦਾ ਹੈ।
5. ਚਿੱਤਰਾਂ ਨੂੰ ਅਨੁਕੂਲ ਬਣਾਓ
ਢੁਕਵੇਂ ਆਕਾਰ ਦੀਆਂ ਤਸਵੀਰਾਂ ਦੀ ਵਰਤੋਂ ਕਰੋ ਅਤੇ ਨੈੱਟਵਰਕ ਚਿੱਤਰਾਂ ਲਈcached_network_imageਦੀ ਵਰਤੋਂ ਕਰਨ 'ਤੇ ਵਿਚਾਰ ਕਰੋ। ਚਿੱਤਰਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਪੂਰੇ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਦੀ ਬਜਾਏ ਡਿਸਪਲੇ ਆਕਾਰ 'ਤੇ ਡੀਕੋਡ ਕਰਨ ਲਈImageਵਿਜੇਟਸ 'ਤੇcacheWidthਅਤੇcacheHeightਨਿਸ਼ਚਿਤ ਕਰੋ।
ਇੱਕ ਸੰਪੂਰਨ UI ਉਦਾਹਰਨ ਬਣਾਉਣਾ
ਆਓ ਅਸੀਂ ਹਰ ਚੀਜ਼ ਨੂੰ ਇੱਕ ਵਿਹਾਰਕ ਉਦਾਹਰਣ ਦੇ ਨਾਲ ਲਿਆਉਂਦੇ ਹਾਂ ਜੋ ਲੇਆਉਟ, ਥੀਮਿੰਗ, ਅਤੇ ਇੰਟਰਐਕਟੀਵਿਟੀ ਨੂੰ ਜੋੜਦੀ ਹੈ।
class ProductCard extends StatelessWidget {
final String title;
final String price;
final String imageUrl;
final VoidCallback onAddToCart;
const ProductCard({
super.key,
required this.title,
required this.price,
required this.imageUrl,
required this.onAddToCart,
});
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Card(
clipBehavior: Clip.antiAlias,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: 16 / 9,
child: Image.network(imageUrl, fit: BoxFit.cover),
),
Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(title, style: theme.textTheme.titleMedium),
const SizedBox(height: 4),
Text(price, style: theme.textTheme.titleLarge?.copyWith(
color: theme.colorScheme.primary,
fontWeight: FontWeight.bold,
)),
const SizedBox(height: 8),
SizedBox(
width: double.infinity,
child: FilledButton.icon(
onPressed: onAddToCart,
icon: const Icon(Icons.shopping_cart),
label: const Text('Add to Cart'),
),
),
],
),
),
],
),
);
}
}ਸਿੱਟਾ
Flutter ਮੋਬਾਈਲ UI ਬਣਾਉਣ ਲਈ ਇੱਕ ਅਵਿਸ਼ਵਾਸ਼ਯੋਗ ਉਤਪਾਦਕ ਵਾਤਾਵਰਣ ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। ਇਸ ਦਾ ਵਿਜੇਟ-ਆਧਾਰਿਤ ਆਰਕੀਟੈਕਚਰ, ਹੌਟ ਰੀਲੋਡ, ਇੱਕ ਅਮੀਰ ਥੀਮਿੰਗ ਸਿਸਟਮ, ਅਤੇ ਸ਼ਕਤੀਸ਼ਾਲੀ ਲੇਆਉਟ ਪ੍ਰਾਈਮਿਟਿਵਜ਼ ਦੇ ਨਾਲ, ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਪਹਿਲਾਂ ਨਾਲੋਂ ਤੇਜ਼ੀ ਨਾਲ ਸੁੰਦਰ, ਜਵਾਬਦੇਹ ਐਪਲੀਕੇਸ਼ਨ ਬਣਾਉਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦਾ ਹੈ। ਵਿਜੇਟ ਟ੍ਰੀ ਨੂੰ ਸਮਝ ਕੇ, ਸਹੀ ਵਿਜੇਟ ਕਿਸਮਾਂ ਦੀ ਚੋਣ ਕਰਕੇ, ਲੇਆਉਟ ਸਿਸਟਮ ਦਾ ਲਾਭ ਉਠਾ ਕੇ, ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਦੇ ਸਭ ਤੋਂ ਵਧੀਆ ਅਭਿਆਸਾਂ ਦੀ ਪਾਲਣਾ ਕਰਕੇ, ਤੁਸੀਂ UIs ਬਣਾ ਸਕਦੇ ਹੋ ਜੋ ਨਾ ਸਿਰਫ਼ ਦ੍ਰਿਸ਼ਟੀਗਤ ਤੌਰ 'ਤੇ ਸ਼ਾਨਦਾਰ ਹਨ, ਸਗੋਂ ਪ੍ਰਦਰਸ਼ਨ ਕਰਨ ਯੋਗ ਅਤੇ ਸਾਂਭਣਯੋਗ ਵੀ ਹਨ।
ਭਾਵੇਂ ਤੁਸੀਂ ਇੱਕ ਸਧਾਰਨ ਪ੍ਰੋਟੋਟਾਈਪ ਬਣਾ ਰਹੇ ਹੋ ਜਾਂ ਇੱਕ ਗੁੰਝਲਦਾਰ ਪ੍ਰੋਡਕਸ਼ਨ ਐਪਲੀਕੇਸ਼ਨ, Flutter ਦੀ UI ਟੂਲਕਿੱਟ ਤੁਹਾਡੀਆਂ ਲੋੜਾਂ ਅਨੁਸਾਰ ਸਕੇਲ ਕਰਦੀ ਹੈ। ਸਧਾਰਨ ਰਚਨਾਵਾਂ ਨਾਲ ਸ਼ੁਰੂ ਕਰੋ, ਵਿਆਪਕ ਵਿਜੇਟ ਕੈਟਾਲਾਗ ਦਾ ਲਾਭ ਉਠਾਓ, ਅਤੇ ਤੁਹਾਡੀ ਐਪਲੀਕੇਸ਼ਨ ਵਧਣ ਦੇ ਨਾਲ ਹੌਲੀ-ਹੌਲੀ ਹੋਰ ਉੱਨਤ ਪੈਟਰਨ ਅਪਣਾਓ। ਗਰਮ ਰੀਲੋਡ ਅਤੇ Flutter ਦੇ ਐਕਸਪ੍ਰੈਸਿਵ API ਦੁਆਰਾ ਤੇਜ਼ੀ ਨਾਲ ਦੁਹਰਾਓ ਦਾ ਸੁਮੇਲ ਮੋਬਾਈਲ UI ਵਿਕਾਸ ਨੂੰ ਇੱਕ ਸੱਚਮੁੱਚ ਆਨੰਦਦਾਇਕ ਅਨੁਭਵ ਬਣਾਉਂਦਾ ਹੈ।