рд╕реНрдкрдВрджрди рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рд╣реИрдВред рд╣рд░ рдорд╣реАрдиреЗ рдпрд╣ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкреНрд░рд╢реНрдиреЛрддреНрддрд░ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдкрдВрджрди рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЬреИрд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЙрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЦрд╛рд▓реА рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡реЗ рдЕрднреА рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд░реВрдкрд░реЗрдЦрд╛ рдХрд┐рд╕ рд▓рд┐рдП рдЕрдЪреНрдЫреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХрд┐рддрдирд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╣реИ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕рд╛рдордЧреНрд░реА:
- рджреГрд╢реНрдп
- рдЗрдВрдЯреЗрдВрдЯ
- рдПрд╕рд┐рдВрдХреНрд╕ рдпреВрдЖрдИ
- рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди
- рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдЯреБрдХрдбрд╝реЗ
- рд▓реЗрдЖрдЙрдЯ
- рдЗрд╢рд╛рд░реЛрдВ рдФрд░ рдЯрдЪ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧред
- рд╕реВрдЪреА рдФрд░ рдПрдбреЗрдкреНрдЯрд░
- рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
- рдЗрдирдкреБрдЯ рдлреЙрд░реНрдо
- рд╕реНрдкрдВрджрди рдкреНрд▓рдЧрдЗрдиреНрд╕
- рд╡рд┐рд╖рдп-рд╡рд╕реНрддреБ
- рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг
- рдиреЛрдЯрд┐рд╕
рджреГрд╢реНрдп
рдкреНрд░рд╢реНрди:
рд╕реНрдкрдВрджрди рдореЗрдВ
рджреГрд╢реНрдп рдХреЗ рд╕рдорддреБрд▓реНрдп рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рд╡рд┐рдЬреЗрдЯрдорддрднреЗрдж:
рджреЗрдЦреЗрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рдЬреЗрдЯ - рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдгред рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рдЬрдм рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рд╣реА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреГрд╢реНрдп рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ
рд╕рд╛рдордЧреНрд░реА рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдореЗрдВ
рд╕рд╛рдордЧреНрд░реА рдбрд┐рдЬрд╛рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЬреЗрдЯ рд╢рд╛рдорд┐рд▓
рд╣реИрдВ ред
рдкреНрд░рд╢реНрди:
рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
StatefulWidget рдФрд░ рдЙрд╕рдХреЗ
рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╕реНрдкрдВрджрди рдореЗрдВ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдЬреЗрдЯ рд╣реИрдВ:
рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдбрдЧреЗрдЯ рдФрд░
рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡реЗрдЯ ред рд╡реЗ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реИред
рдорддрднреЗрдж:
рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдерд┐рддрд┐ рд╣реИред рдкрд╛рда, рд▓реЛрдЧреЛ рдЖрджрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрд╛рдиреА рдпрджрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рдореМрдЬреВрдж рддрддреНрд╡ рдкреВрд░реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдЯрд╛рдЗрдо рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рдЖрдкрдХреЛ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
StatefulWidget рдореЗрдВ рд░рд╛рдЬреНрдп рд░рд╛рдЬреНрдп рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддреЗ рд╕рдордп рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛, рдЖрджрд┐) - рдпрд╣ рдЖрдкрдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
1) рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдЬреЗрдЯ - рдЯреЗрдХреНрд╕реНрдЯ
Text( 'I like Flutter!', style: TextStyle(fontWeight: FontWeight.bold), );
2) рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡рд┐рдбрдЧ - рдЬрдм рдЖрдк (рдлреНрд▓реЛрдЯрд┐рдВрдЧрдПрд╢рдирдмрдЯрди) рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ "I рд▓рд╛рдЗрдХ рдлреНрд▓рдЯрд░" рд╕реЗ "рдлреНрд▓рдЯрд░ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ!" рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
рдкреНрд░рд╢реНрди:
рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдХреЛ рдХреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХрд░реЗрдВ? XML рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХрд╣рд╛рдБ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдХреЛрдИ XML рд▓реЗрдЖрдЙрдЯ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center( child: MaterialButton( onPressed: () {}, child: Text('Hello'), padding: EdgeInsets.only(left: 10.0, right: 10.0), ), ), ); }
рд╕реНрдкрдВрджрди рдореЗрдВ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдЬреЗрдЯ
рд╡рд┐рдЬреЗрдЯ рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рд╢реНрди:
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╕рдордп рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдПрдХ рдШрдЯрдХ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рдирд┐рдХрд╛рд▓реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдЬреЗрдЯ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рдорддрднреЗрдж:
Android рдкрд░, рдЖрдк рдПрдХ ViewGroup рдореЗрдВ AddView () рдпрд╛ removeView () рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди рдореЗрдВ, рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИрдВред рдХреЗрд╡рд▓ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рд╕рдХрддреА рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧрдПрд╢рдирдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдмрдЯрди рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓реЗрдВред
import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
рдкреНрд░рд╢реНрди:
рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЛ рдЪреЗрддрди рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рдПрдирд┐рдореЗрд╢рдирдХрдВрдЯреНрд░реЛрд▓рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреЛ
рдПрдирд┐рдореЗрд╢рди <рдЯреА> рд╕рд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИред рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдЗрд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдЙрд▓реНрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЦреЗрд▓ рд╕рдХрддрд╛ рд╣реИред
рдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕реНрдХреНрд░реАрди redraw рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдорддрднреЗрдж:
Android рдкрд░, рдЖрдк XML рдпрд╛ рдЪреЗрддрди рджреГрд╢реНрдп рдореЗрдВ рдЪреЗрддрди () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди рдореЗрдВ, рдПрдиреАрдореЗрд╢рди рдХреЛ рдПрдиреАрдореЗрд╢рдирдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рдЖрдк
рдПрдиреАрдореЗрд╢рди рдФрд░ рдореЛрд╢рди рд╡рд┐рдЬреЗрдЯ ,
рдПрдирд┐рдореЗрд╢рди рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░
рдПрдирд┐рдореЗрд╢рди рдЕрд╡рд▓реЛрдХрди рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдлрд╝реНрд▓рдЯрд░ рд▓реЛрдЧреЛ рдХрд╛ рдлреАрдХрд╛ рдПрдиреАрдореЗрд╢рдиред
import 'package:flutter/material.dart'; void main() { runApp(FadeAppTest()); } class FadeAppTest extends StatelessWidget {
рдкреНрд░рд╢реНрди:
рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рд╕реНрдкрдВрджрди рдореЗрдВ рдХреИрдирд╡рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдПрдкреАрдЖрдИ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╕реНрддрд░ рдХреЗ
рд╕реНрдХрд┐рдЖ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдорддрднреЗрдж:
рдирд╣реАрдВред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
Flutter рдореЗрдВ Canvas -
CustomPaint рдФрд░
CustomPainter рдкрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рджреВрд╕рд░рд╛ рдЖрдкрдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ:
StackOverflowрдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'package:flutter/material.dart'; void main() => runApp(MaterialApp(home: DemoApp())); class DemoApp extends StatelessWidget { Widget build(BuildContext context) => Scaffold(body: Signature()); } class Signature extends StatefulWidget { SignatureState createState() => SignatureState(); } class SignatureState extends State<Signature> { List<Offset> _points = <Offset>[]; Widget build(BuildContext context) { return GestureDetector( onPanUpdate: (DragUpdateDetails details) { setState(() { RenderBox referenceBox = context.findRenderObject(); Offset localPosition = referenceBox.globalToLocal(details.globalPosition); _points = List.from(_points)..add(localPosition); }); }, onPanEnd: (DragEndDetails details) => _points.add(null), child: CustomPaint(painter: SignaturePainter(_points), size: Size.infinite), ); } } class SignaturePainter extends CustomPainter { SignaturePainter(this.points); final List<Offset> points; void paint(Canvas canvas, Size size) { var paint = Paint() ..color = Colors.black ..strokeCap = StrokeCap.round ..strokeWidth = 5.0; for (int i = 0; i < points.length - 1; i++) { if (points[i] != null && points[i + 1] != null) canvas.drawLine(points[i], points[i + 1], paint); } } bool shouldRepaint(SignaturePainter other) => other.points != points; }
рдкреНрд░рд╢реНрди:
рдХрд╕реНрдЯрдо рд╡рд┐рдЬреЗрдЯ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рд╡рд┐рдЬреЗрдЯ рдХреЛ рдПрдХ рдХреЗ рдЕрдВрджрд░ (рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрдЬрд╛рдп) рд▓рд┐рдЦреЗрдВред
рдорддрднреЗрдж:
рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ, рд╣рдо рдЙрд╕ рджреГрд╢реНрдп рд╕реЗ рд╡рд╛рд░рд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди рдореЗрдВ, рдпрд╣ рдПрдХ рд╡реНрдпреВрдЧреНрд░реБрдк рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рд╡рд┐рдЬреЗрдЯ рд╣рдореЗрд╢рд╛ рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдЬреЗрдЯ рдпрд╛ рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡реЗрдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдпрд╛рдиреА рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рд╡рд┐рдЬреЗрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
class CustomButton extends StatelessWidget { final String label; CustomButton(this.label); @override Widget build(BuildContext context) { return RaisedButton(onPressed: () {}, child: Text(label)); } } @override Widget build(BuildContext context) { return Center( child: CustomButton("Hello"), ); }
рдЗрдВрдЯреЗрдВрдЯ
рдкреНрд░рд╢реНрди:
рд╕реНрдкрдВрджрди рдореЗрдВ
рдЖрд╢рдп рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рд╡рд╣ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИред рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рд╕реЗ
рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдФрд░
рд░реВрдЯ рдХрдХреНрд╖рд╛рдУрдВ
рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред
рдмрд╛рд╣рд░реА рдШрдЯрдХреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХреИрдорд░рд╛ рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдкрд┐рдХрд░) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдордВрдЪ рдкрд░
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдпрд╛ рджреЗрд╢реА рдПрдХреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЗрд╢реА рдПрдХреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ:
рд╕рдВрдХреБрд▓ рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рдирд╛ ред
рдорддрднреЗрдж:
рд╕реНрдкрдВрджрди рдореЗрдВ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдФрд░ рдлреНрд░реИрдЧрдореЗрдВрдЯ рдЬреИрд╕реА рдХреЛрдИ рдЪреАрдЬ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ (рдиреЗрд╡рд┐рдЧреЗрдЯрд░) рдФрд░ рд░реВрдЯ (рд░реВрдЯ) рд╣реИрдВред рд╕реНрдкрдВрджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдПрдХ рдПрдХрд▓-рдЧрддрд┐рд╡рд┐рдзрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреНрд░реАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрд╢реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлреНрд░реИрдЧрдореЗрдВрдЯрдореИрди рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ FragmentManager рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рд░реНрдЧ рдкрд░
рдкреБрд╢ () рдпрд╛
рдкреЙрдк () рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд░реВрдЯ рдПрдХ рддрд░рд╣ рдХрд╛ рдлреНрд░реИрдЧрдореЗрдВрдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдпрд╛ рдкреЗрдЬ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рд░рд┐рд╡рд╛рдЬрд╝ рд╣реИред
Android рдореЗрдВ, рд╣рдо рдЙрди рд╕рднреА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмреАрдЪ рд╣рдо AndroidManifest.xml рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдкрдВрджрди рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдорд╛рд░реНрдЧ (MaterialApp) рдирд╛рдордХ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
- рд░реВрдЯ (WidgetApp) рдкрд░ рд╕реАрдзреЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
void main() { runApp(MaterialApp( home: MyAppHome(),
рдкреНрд░рд╢реНрди:
рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯреЗрдВрдЯреНрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
MethodChannel рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА Android рдкрд░рдд рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рд╣рдо AndroidManifest.xml рдореЗрдВ рдЖрд╢рдп-рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
<activity android:name=".MainActivity" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity>
рд╣рдо рдордВрд╢рд╛ рдореЗрдВ рдЗрд░рд╛рджреЗ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХреЛ рдлрд╝реНрд▓рдЯрд░ рд╕реЗ MethodChannel рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ:
package com.example.shared; import android.content.Intent; import android.os.Bundle; import java.nio.ByteBuffer; import io.flutter.app.FlutterActivity; import io.flutter.plugin.common.ActivityLifecycleListener; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugins.GeneratedPluginRegistrant; public class MainActivity extends FlutterActivity { private String sharedText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); GeneratedPluginRegistrant.registerWith(this); Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent);
рд╣рдо рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡рд┐рдЬреЗрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
рдкреНрд░рд╢реНрди:
StartActivityForResult () рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдФрд░
рднрд╡рд┐рд╖реНрдп рд╡рд░реНрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдорддрднреЗрдж:
Android рдореЗрдВ startActivityForResult () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ onActivityResult () рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдкрдВрджрди рдХреЛ рдХреБрдЫ рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рд╡рд┐рдзрд┐ рдкреБрд╢ () рдлреНрдпреВрдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
Map coordinates = await Navigator.of(context).pushNamed('/location');
рдФрд░ рдЬрдм рд╣рдореЗрдВ '/' рд╕реНрдерд╛рди рд╕реНрдХреНрд░реАрди рдкрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдорд┐рд▓рд╛, рддреЛ рдкреЙрдк рдХрд░реЗрдВ ():
Navigator.of(context).pop({"lat":43.821757,"long":-79.226392});
рдПрд╕рд┐рдВрдХреНрд╕ рдпреВрдЖрдИ
рдкреНрд░рд╢реНрди:
рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ
runOnUiThread () рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рдбрд╛рд░реНрдЯ
рдЖрдЗрд╕реЛрд▓реЗрдЯреНрд╕ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк C #, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдпрд╛ рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЯрд╛рдЗрди рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ UI рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛:
loadData() async { String dataURL = "https://jsonplaceholder.typicode.com/posts"; http.Response response = await http.get(dataURL); setState(() { widgets = json.decode(response.body); }); }
рдЬрдм рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдирдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд╕реЗрдЯрд╕реНрдЯреЗрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛
рд╣реЛрдЧрд╛ ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рд╕реВрдЪреА рдореЗрдВ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдирд╛ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛:
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample App', theme: ThemeData( primarySwatch: Colors.blue, ), home: SampleAppPage(), ); } } class SampleAppPage extends StatefulWidget { SampleAppPage({Key key}) : super(key: key); @override _SampleAppPageState createState() => _SampleAppPageState(); } class _SampleAppPageState extends State<SampleAppPage> { List widgets = []; @override void initState() { super.initState(); loadData(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: ListView.builder( itemCount: widgets.length, itemBuilder: (BuildContext context, int position) { return getRow(position); })); } Widget getRow(int i) { return Padding( padding: EdgeInsets.all(10.0), child: Text("Row ${widgets[i]["title"]}") ); } loadData() async { String dataURL = "https://jsonplaceholder.typicode.com/posts"; http.Response response = await http.get(dataURL); setState(() { widgets = json.decode(response.body); }); } }
рдкреНрд░рд╢реНрди:
рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рдореЗрдВ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдФрд░ рдЕрд▓рдЧрд╛рд╡ (рдЖрдЗрд╕реЛрд▓реЗрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдорддрднреЗрдж:
Android рдкрд░ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рдЖрдк AsyncTask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ
рдЗрд╕рдореЗрдВ onPreExecute () ,
doInBackground () ,
onPostExecute () рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдкрдВрджрди "рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕" рдореЗрдВ рдЖрдкрдХреЛ рдмрд╕ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдбрд╛рд░реНрдЯ рдмрд╛рдХреА рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдпрд╣рд╛рдБ dataLoader () рд╡рд┐рдзрд┐ рдЕрд▓рдЧ-рдерд▓рдЧ рд╣реИред рдЕрд▓рдЧрд╛рд╡ рдореЗрдВ, рдЖрдк рднрд╛рд░реА рдСрдкрд░реЗрд╢рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдмрдбрд╝реЗ JSONs, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди, рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЖрджрд┐ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ред
loadData() async { ReceivePort receivePort = ReceivePort(); await Isolate.spawn(dataLoader, receivePort.sendPort);
рдкреНрд░рд╢реНрди:
OkHttp рдХрд╛ рд╕реНрдкрдВрджрди рд╕рдорддреБрд▓реНрдп рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рд╕реНрдкрдВрджрди рдХрд╛ рдЕрдкрдирд╛
HTTP рдкреИрдХреЗрдЬ рд╣реИ ред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рдЕрдм рддрдХ, HTTP рдкреИрдХреЗрдЬ рдореЗрдВ рд╕рднреА OkHttp рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдИ рдЕрдиреБрдкрд▓рдмреНрдз рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╕рд╛рд░ рд╣реИрдВ рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╕реНрд╡рдпрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
HTTP рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ pubspec.yaml рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
dependencies: ... http: ^0.11.3+16
рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, async рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЙрд▓ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ http.get ():
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; [...] loadData() async { String dataURL = "https://jsonplaceholder.typicode.com/posts"; http.Response response = await http.get(dataURL); setState(() { widgets = json.decode(response.body); }); } }
рдкреНрд░рд╢реНрди:
рдкреНрд░рдЧрддрд┐ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдПрдВ?
рдЙрддреНрддрд░ рд╣реИ:
ProgressIndicator рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample App', theme: ThemeData( primarySwatch: Colors.blue, ), home: SampleAppPage(), ); } } class SampleAppPage extends StatefulWidget { SampleAppPage({Key key}) : super(key: key); @override _SampleAppPageState createState() => _SampleAppPageState(); } class _SampleAppPageState extends State<SampleAppPage> { List widgets = []; @override void initState() { super.initState(); loadData(); } showLoadingDialog() { return widgets.length == 0; } getBody() { if (showLoadingDialog()) { return getProgressDialog(); } else { return getListView(); } } getProgressDialog() { return Center(child: CircularProgressIndicator()); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: getBody()); } ListView getListView() => ListView.builder( itemCount: widgets.length, itemBuilder: (BuildContext context, int position) { return getRow(position); }); Widget getRow(int i) { return Padding(padding: EdgeInsets.all(10.0), child: Text("Row ${widgets[i]["title"]}")); } loadData() async { String dataURL = "https://jsonplaceholder.typicode.com/posts"; http.Response response = await http.get(dataURL); setState(() { widgets = json.decode(response.body); }); } }
рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди
рдкреНрд░рд╢реНрди:
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рд╕рдВрдкрддреНрддрд┐ рдореЗрдВред
рдорддрднреЗрдж:
рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдПрдХ рд░рд┐рд╕ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред рд╕рдВрдкрддреНрддрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд╣реАрдВ рднреА рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ pubspec.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕реЗ рдкрде рд▓рд┐рдЦреЗрдВред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рд╕реНрдкрдВрджрди рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ред
рд╕реНрдкрдВрджрди рдХреЛрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдПрд╕реЗрдЯрдореИрдирдЧрд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
AssetManager:
val flutterAssetStream = assetManager.open("flutter_assets/assets/my_flutter_asset.png")
рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд╛рди:
images/my_icon.png // Base: 1.0x image images/2.0x/my_icon.png // 2.0x image images/3.0x/my_icon.png // 3.0x image
Pubspec.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрде:
assets: - images/my_icon.jpeg
AssetImage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
return AssetImage("images/a_dot_burr.jpeg");
рд╕реАрдзреЗ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
@override Widget build(BuildContext context) { return Image.asset("images/my_image.png"); }
рдкреНрд░рд╢реНрди:
рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╣рд╛рдБ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ? рдЙрдирдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВред
Intl рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░реЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
class Strings { static String welcomeMessage = "Welcome To Flutter"; } Text(Strings.welcomeMessage)
рдкреНрд░рд╢реНрди:
рдЧреНрд░реЗрдб рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ рдирд┐рд░реНрднрд░рддрд╛ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
pubspec.yamlред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рд╕реНрдкрдВрджрди рджреЗрд╢реА Android рдФрд░ iOS рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
рдкрдм рдореЗрдВ рдлрд╝реНрд▓рдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВред
рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдЯреБрдХрдбрд╝реЗ
рдкреНрд░рд╢реНрди:
рд╕реНрдкрдВрджрди рдореЗрдВ
рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░
рдлреНрд░реИрдЧрдореЗрдВрдЯ рдХреЗ рдмрд░рд╛рдмрд░ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рд╕реНрдкрдВрджрди рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡рд┐рдЧреЗрдЯреНрд╕ рд╣реИред UI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдХреА рднреВрдорд┐рдХрд╛ рд╡рд┐рдЧреЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рднрд╛рдИ рдЬрд╛рддреА рд╣реИред рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рднреВрдорд┐рдХрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИ, рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдФрд░ рд░реВрдЯ рд╣реИред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдлрд╝реНрд▓рдЯрд░: рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐ рдпреВрдЖрдИ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ ред
рдкреНрд░рд╢реНрди:
рдЬреАрд╡рди рдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
WidgetsBinding рдФрд░
didChangeAppLifecycleState () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рд╕реНрдкрдВрджрди рдореВрд▓ рдХреЛрдб рдореЗрдВ FlutterActivity рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдкрдВрджрди рдЗрдВрдЬрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЕрд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЬреАрд╡рди рдЪрдХреНрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ:
- рдирд┐рд╖реНрдХреНрд░рд┐рдп - рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ iOS рдореЗрдВ рд╣реИ, рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИ;
- рд░реЛрдХрд╛ рдЧрдпрд╛ - Android рдореЗрдВ onPause () рдХреЗ рд╕рдорд╛рди;
- рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ - Android рдореЗрдВ onPostResume () рдХреЗ рд╕рдорд╛рди;
- рдирд┐рд▓рдВрдмрд┐рдд - Android рдореЗрдВ onStop рдХреЗ рд╕рдорд╛рди, iOS рдореЗрдВ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИред
рдпрд╣
AppLifecycleStatus рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'package:flutter/widgets.dart'; class LifecycleWatcher extends StatefulWidget { @override _LifecycleWatcherState createState() => _LifecycleWatcherState(); } class _LifecycleWatcherState extends State<LifecycleWatcher> with WidgetsBindingObserver { AppLifecycleState _lastLifecycleState; @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } @override void didChangeAppLifecycleState(AppLifecycleState state) { setState(() { _lastLifecycleState = state; }); } @override Widget build(BuildContext context) { if (_lastLifecycleState == null) return Text('This widget has not observed any lifecycle changes.', textDirection: TextDirection.ltr); return Text('The most recent lifecycle state this widget observed was: $_lastLifecycleState.', textDirection: TextDirection.ltr); } } void main() { runApp(Center(child: LifecycleWatcher())); }
рд▓реЗрдЖрдЙрдЯ
рдкреНрд░рд╢реНрди:
LinearLayout рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рдХреНрд╖реИрддрд┐рдЬ рдХреЗ рд▓рд┐рдП
рдкрдВрдХреНрддрд┐ , рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреЗ рд▓рд┐рдП
рдХреЙрд▓рдо ред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:
рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдлрд╝реНрд▓рдЯрд░: рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рд▓рд┐рдиреЗрд░рд▓реЙрдпрдЖрдЙрдЯ рдХреИрд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░реЗрдВ?рдПрдХ рдЙрджрд╛рд╣рд░рдг:
@override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Row One'), Text('Row Two'), Text('Row Three'), Text('Row Four'), ], ); } @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Column One'), Text('Column Two'), Text('Column Three'), Text('Column Four'), ], ); }
рдкреНрд░рд╢реНрди:
RelativeLayout рдХреЗ рд╕рдорддреБрд▓реНрдп рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рд╡рд┐рдЬреЗрдЯ
рдвреЗрд░ ред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:
StackOverflowрдкреНрд░рд╢реНрди:
рд╕реНрдХреНрд░реЙрд▓рд╡реНрдпреВ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
@override Widget build(BuildContext context) { return ListView( children: <Widget>[ Text('Row One'), Text('Row Two'), Text('Row Three'), Text('Row Four'), ], ); }
рдкреНрд░рд╢реНрди:
рдкреЛрд░реНрдЯреНрд░реЗрдЯ рдФрд░ рд▓реИрдВрдбрд╕реНрдХреЗрдк рдХреЗ рдмреАрдЪ рдмрджрд▓рд╛рд╡ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
AndroidManifest.xml рдореЗрдВ рдлрд╝реНрд▓рдЯрд░ рд╡реНрдпреВ рдлрд╝реНрд▓рд┐рдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
Android: configChanges = "рдЕрднрд┐рд╡рд┐рдиреНрдпрд╛рд╕ | рд╕реНрдХреНрд░реАрдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВ"
рдЗрд╢рд╛рд░реЛрдВ рдФрд░ рдЯрдЪ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ
рдкреНрд░рд╢реНрди:
Flutter рдореЗрдВ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП onClick рд╢реНрд░реЛрддрд╛ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
рдпрджрд┐ рд╡рд┐рдЬреЗрдЯ рдХреНрд▓рд┐рдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдСрдирдкреНрд░реЗрд╕реНрдб () рдореЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ onTap () рдореЗрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
OnPressed () рдореЗрдВ:
@override Widget build(BuildContext context) { return RaisedButton( onPressed: () { print("click"); }, child: Text("Button")); }
рдСрдирдЯреИрдк () рдореЗрдВ:
class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: GestureDetector( child: FlutterLogo( size: 200.0, ), onTap: () { print("tap"); }, ), )); } }
рдкреНрд░рд╢реНрди:
рд╡рд┐рдЧреЗрдЯреНрд╕ рдкрд░ рдЕрдиреНрдп рдЗрд╢рд╛рд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ?
рдЙрддреНрддрд░ рд╣реИ:
GestureDetector рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╡реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
рдирд▓
рдбрдмрд▓ рдЯреИрдк
рд▓рдВрдмреА рдкреНрд░реЗрд╕
рд▓рдВрдмрд╡рдд рдЦреАрдВрдЪреЗрдВ
рдХреНрд╖реИрддрд┐рдЬ рдЦреАрдВрдЪреЗрдВ
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдбрдмрд▓рдбреИрдк:
AnimationController controller; CurvedAnimation curve; @override void initState() { controller = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this); curve = CurvedAnimation(parent: controller, curve: Curves.easeIn); } class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Center( child: GestureDetector( child: RotationTransition( turns: curve, child: FlutterLogo( size: 200.0, )), onDoubleTap: () { if (controller.isCompleted) { controller.reverse(); } else { controller.forward(); } }, ), )); } }
рд╕реВрдЪреА рдФрд░ рдПрдбреЗрдкреНрдЯрд░
рдкреНрд░рд╢реНрди:
рд╕реНрдкрдВрджрди рдореЗрдВ
ListView рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?
рдЙрддреНрддрд░ рд╣реИ:
ListView ред
рдорддрднреЗрдж:
рд╕реНрдкрдВрджрди рдХреЛ рдЖрдЗрдЯрдо рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ (рдЬреЛ ViewHolder рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android рдореЗрдВ ListView / RecyclerView рдХрд░рддрд╛ рд╣реИ)ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
рдкреНрд░рд╢реНрди:
рдХреИрд╕реЗ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕ рддрддреНрд╡ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?
рдЙрддреНрддрд░ рд╣реИ:
рдПрдХ
GestureDetector рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо
рд▓рдкреЗрдЯрдирд╛ ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
рдкреНрд░рд╢реНрди:
рд▓рд┐рд╕реНрдЯ рд╡реНрдпреВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ?рдЙрддреНрддрд░ рд╣реИ:
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╣реИ, рддреЛ рдпрд╣ setState () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрджрд┐ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ ListView.Builder рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ , рдЬреЛ RecyclerView рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ редрдПрдХ рдЙрджрд╛рд╣рд░рдг:
SetState рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ () : import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
ListView.Builder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ : import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдкреНрд░рд╢реНрди:
рдХрд╕реНрдЯрдо рдлреЛрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?рдЙрддреНрддрд░ рд╣реИ:
рдЖрдкрдХреЛ рдмрд╕ рдлреЙрдиреНрдЯ рдлрд╛рдЗрд▓ рдХреЛ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдЦреБрдж рдХреЗ рдирд╛рдо рдкрд░ рд╕реЛрдЪреЗрдВ) рдФрд░ pubspec.yaml рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рдмрддрд╛рдПрдВредрдПрдХ рдЙрджрд╛рд╣рд░рдг:
fonts: - family: MyCustomFont fonts: - asset: fonts/MyCustomFont.ttf - style: italic
@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center( child: Text( 'This is a custom font text', style: TextStyle(fontFamily: 'MyCustomFont'), ), ), ); }
рдкреНрд░рд╢реНрди:
рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдЬреЗрдЯ рдХреИрд╕реЗ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░реЗрдВ?рдЙрддреНрддрд░ рд╣реИ:
рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ:- рд░рдВрдЧ;
- рд╕рдЬрд╛рд╡рдЯ;
- decorationColor;
- decorationStyle;
- FontFamily;
- fONTSIZE;
- fontStyle;
- fontWeight;
- hashCode;
- рдКрдВрдЪрд╛рдИ;
- рд╡рд╛рд░рд┐рд╕;
- letterSpacing;
- textBaseline;
- wordSpacing.
:
Retrieve the value of a text field .
:
hint
TextInput ?
рдЙрддреНрддрд░ рд╣реИ:
InputDecoration , .
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
body: Center( child: TextField( decoration: InputDecoration(hintText: "This is a hint"), ) )
:
?
рдЙрддреНрддрд░ рд╣реИ:
тАФ
InputDecoration .
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget {
Flutter
:
GPS?
рдЙрддреНрддрд░ рд╣реИ:
geolocator .
:
?
рдЙрддреНрддрд░ рд╣реИ:
image_picker .
:
Facebook?
рдЙрддреНрддрд░ рд╣реИ:
flutter_facebook_login .
:
Firebase?
рдЙрддреНрддрд░ рд╣реИ:
Firebase
Flutter first party plugins .
:
() ?
рдЙрддреНрддрд░ рд╣реИ:
Flutter EventBus . :
developing packages and plugins .
:
NDK?
рдЙрддреНрддрд░ рд╣реИ:
NDK- Flutter. Flutter .
Themes
:
(Theme) ?
рдЙрддреНрддрд░ рд╣реИ:
MaterialApp WidgetApp .
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample App', theme: ThemeData( primarySwatch: Colors.blue, textSelectionColor: Colors.red ), home: SampleAppPage(), ); } }
:
Shared Preferences?
рдЙрддреНрддрд░ рд╣реИ:
Shared_Preferences plugin ( NSUserDefaults iOS ).
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; void main() { runApp( MaterialApp( home: Scaffold( body: Center( child: RaisedButton( onPressed: _incrementCounter, child: Text('Increment Counter'), ), ), ), ), ); } _incrementCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); int counter = (prefs.getInt('counter') ?? 0) + 1; print('Pressed $counter times.'); prefs.setInt('counter', counter); }
:
SQLite Flutter?
рдЙрддреНрддрд░ рд╣реИ:
SQFlite .
:
push-?
рдЙрддреНрддрд░ рд╣реИ:
Firebase_Messaging .
рдирд┐рд╖реНрдХрд░реНрд╖
. , , . ┬л ┬╗ . ┬л-┬╗ . , ? 2016 Kotlin, - 2017. , , . , .
2016 Flutter Dart. , 2018 . . ! , , , . ( Google Fuchsia , , , Flutter ). тАФ ! , тАФ . рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣реА рд╕рдм рд╣реИ Google Play!