[рдбреЙрдХ рджреНрд╡рд╛рд░рд╛] рд╕реНрдкрдВрджрдиред рднрд╛рдЧ 1. Android рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП

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

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



рд╕рд╛рдордЧреНрд░реА:


  1. рджреГрд╢реНрдп

  2. рдЗрдВрдЯреЗрдВрдЯ

  3. рдПрд╕рд┐рдВрдХреНрд╕ рдпреВрдЖрдИ

  4. рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрди

  5. рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░ рдЯреБрдХрдбрд╝реЗ

  6. рд▓реЗрдЖрдЙрдЯ

  7. рдЗрд╢рд╛рд░реЛрдВ рдФрд░ рдЯрдЪ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧред

  8. рд╕реВрдЪреА рдФрд░ рдПрдбреЗрдкреНрдЯрд░

  9. рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ

  10. рдЗрдирдкреБрдЯ рдлреЙрд░реНрдо

  11. рд╕реНрдкрдВрджрди рдкреНрд▓рдЧрдЗрдиреНрд╕

  12. рд╡рд┐рд╖рдп-рд╡рд╕реНрддреБ

  13. рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг

  14. рдиреЛрдЯрд┐рд╕


рджреГрд╢реНрдп


рдкреНрд░рд╢реНрди:


рд╕реНрдкрдВрджрди рдореЗрдВ рджреГрд╢реНрдп рдХреЗ рд╕рдорддреБрд▓реНрдп рдХреНрдпрд╛ рд╣реИ?

рдЙрддреНрддрд░ рд╣реИ:


рд╡рд┐рдЬреЗрдЯ

рдорддрднреЗрдж:


рджреЗрдЦреЗрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рдЬреЗрдЯ - рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдгред рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдирдП рд╕рд┐рд░реЗ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:


рдЬрдм рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рд╣реА рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреГрд╢реНрдп рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рд╣реЛрддрд╛ рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдШрдЯрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдбрд┐рдЬрд╛рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдЬреЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ ред

рдкреНрд░рд╢реНрди:


рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ?

рдЙрддреНрддрд░ рд╣реИ:


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 { //     . @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> { //   String textToShow = "  Flutter"; void _updateText() { setState(() { //   textToShow = "Flutter !"; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center(child: Text(textToShow)), floatingActionButton: FloatingActionButton( onPressed: _updateText, tooltip: ' ', child: Icon(Icons.update), ), ); } } 

рдкреНрд░рд╢реНрди:


рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдХреЛ рдХреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХрд░реЗрдВ? 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 { //     . @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> { //     bool toggle = true; void _toggle() { setState(() { toggle = !toggle; }); } _getToggleChild() { if (toggle) { return Text('Toggle One'); } else { return MaterialButton(onPressed: () {}, child: Text('Toggle Two')); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center( child: _getToggleChild(), ), floatingActionButton: FloatingActionButton( onPressed: _toggle, tooltip: 'Update Text', child: Icon(Icons.update), ), ); } } 

рдкреНрд░рд╢реНрди:


рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЛ рдЪреЗрддрди рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдЙрддреНрддрд░ рд╣реИ:


рдПрдирд┐рдореЗрд╢рдирдХрдВрдЯреНрд░реЛрд▓рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреЛ рдПрдирд┐рдореЗрд╢рди <рдЯреА> рд╕рд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИред рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдЗрд╕реЗ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдЙрд▓реНрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЦреЗрд▓ рд╕рдХрддрд╛ рд╣реИред рдЯрд┐рдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕реНрдХреНрд░реАрди redraw рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

рдорддрднреЗрдж:


Android рдкрд░, рдЖрдк XML рдпрд╛ рдЪреЗрддрди рджреГрд╢реНрдп рдореЗрдВ рдЪреЗрддрди () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди рдореЗрдВ, рдПрдиреАрдореЗрд╢рди рдХреЛ рдПрдиреАрдореЗрд╢рдирдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:


рдЖрдк рдПрдиреАрдореЗрд╢рди рдФрд░ рдореЛрд╢рди рд╡рд┐рдЬреЗрдЯ , рдПрдирд┐рдореЗрд╢рди рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ рдПрдирд┐рдореЗрд╢рди рдЕрд╡рд▓реЛрдХрди рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:


рдлрд╝реНрд▓рдЯрд░ рд▓реЛрдЧреЛ рдХрд╛ рдлреАрдХрд╛ рдПрдиреАрдореЗрд╢рдиред

 import 'package:flutter/material.dart'; void main() { runApp(FadeAppTest()); } class FadeAppTest extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Fade Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyFadeTest(title: 'Fade Demo'), ); } } class MyFadeTest extends StatefulWidget { MyFadeTest({Key key, this.title}) : super(key: key); final String title; @override _MyFadeTest createState() => _MyFadeTest(); } class _MyFadeTest extends State<MyFadeTest> with TickerProviderStateMixin { AnimationController controller; CurvedAnimation curve; @override void initState() { super.initState(); controller = AnimationController(duration: const Duration(milliseconds: 2000), vsync: this); curve = CurvedAnimation(parent: controller, curve: Curves.easeIn); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Container( child: FadeTransition( opacity: curve, child: FlutterLogo( size: 100.0, )))), floatingActionButton: FloatingActionButton( tooltip: 'Fade', child: Icon(Icons.brush), onPressed: () { controller.forward(); }, ), ); } } 

рдкреНрд░рд╢реНрди:


рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдЙрддреНрддрд░ рд╣реИ:


рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рд╕реНрдкрдВрджрди рдореЗрдВ рдХреИрдирд╡рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдПрдкреАрдЖрдИ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рд╕рдорд╛рди рд╕реНрддрд░ рдХреЗ рд╕реНрдХрд┐рдЖ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдорддрднреЗрдж:


рдирд╣реАрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:


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(), // becomes the route named '/' routes: <String, WidgetBuilder> { '/a': (BuildContext context) => MyPage(title: 'page A'), '/b': (BuildContext context) => MyPage(title: 'page B'), '/c': (BuildContext context) => MyPage(title: 'page C'), }, )); } Navigator.of(context).pushNamed('/b'); 

рдкреНрд░рд╢реНрди:


рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯреЗрдВрдЯреНрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░реЗрдВ?

рдЙрддреНрддрд░ рд╣реИ:


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); // Handle text being sent } } new MethodChannel(getFlutterView(), "app.channel.shared.data").setMethodCallHandler( new MethodCallHandler() { @Override public void onMethodCall(MethodCall call, MethodChannel.Result result) { if (call.method.contentEquals("getSharedText")) { result.success(sharedText); sharedText = null; } } }); } void handleSendText(Intent intent) { sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); } } 

рд╣рдо рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╡рд┐рдЬреЗрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

 import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample Shared App Handler', 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> { static const platform = const MethodChannel('app.channel.shared.data'); String dataShared = "No data"; @override void initState() { super.initState(); getSharedText(); } @override Widget build(BuildContext context) { return Scaffold(body: Center(child: Text(dataShared))); } getSharedText() async { var sharedData = await platform.invokeMethod("getSharedText"); if (sharedData != null) { setState(() { dataShared = sharedData; }); } } } 

рдкреНрд░рд╢реНрди:


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); // The 'echo' isolate sends its SendPort as the first message SendPort sendPort = await receivePort.first; List msg = await sendReceive(sendPort, "https://jsonplaceholder.typicode.com/posts"); setState(() { widgets = msg; }); } // The entry point for the isolate static dataLoader(SendPort sendPort) async { // Open the ReceivePort for incoming messages. ReceivePort port = ReceivePort(); // Notify any other isolates what port this isolate listens to. sendPort.send(port.sendPort); await for (var msg in port) { String data = msg[0]; SendPort replyTo = msg[1]; String dataURL = data; http.Response response = await http.get(dataURL); // Lots of JSON to parse replyTo.send(json.decode(response.body)); } } Future sendReceive(SendPort port, msg) { ReceivePort response = ReceivePort(); port.send([msg, response.sendPort]); return response.first; }   : import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:async'; import 'dart:isolate'; 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() { if (widgets.length == 0) { return true; } return false; } 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 { ReceivePort receivePort = ReceivePort(); await Isolate.spawn(dataLoader, receivePort.sendPort); // The 'echo' isolate sends its SendPort as the first message SendPort sendPort = await receivePort.first; List msg = await sendReceive(sendPort, "https://jsonplaceholder.typicode.com/posts"); setState(() { widgets = msg; }); } // the entry point for the isolate static dataLoader(SendPort sendPort) async { // Open the ReceivePort for incoming messages. ReceivePort port = ReceivePort(); // Notify any other isolates what port this isolate listens to. sendPort.send(port.sendPort); await for (var msg in port) { String data = msg[0]; SendPort replyTo = msg[1]; String dataURL = data; http.Response response = await http.get(dataURL); // Lots of JSON to parse replyTo.send(json.decode(response.body)); } } Future sendReceive(SendPort port, msg) { ReceivePort response = ReceivePort(); port.send([msg, response.sendPort]); return response.first; } } 

рдкреНрд░рд╢реНрди:


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 рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕реЗ рдкрде рд▓рд┐рдЦреЗрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА:


рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рд╕реНрдкрдВрджрди рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреА рддреБрд▓рдирд╛ред
Android рдШрдирддреНрд╡ рдХреНрд╡рд╛рд▓реАрдлрд╛рдпрд░рд╕реНрдкрдВрджрди рдкрд┐рдХреНрд╕реЗрд▓ рдЕрдиреБрдкрд╛рдд
ldpi0.75x
mdpi1.0x
hdpi1.5x
xhdpi2.0x
xxhdpi3.0x
xxxhdpi4.0x
рд╕реНрдкрдВрджрди рдХреЛрдб рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдПрд╕реЗрдЯрдореИрдирдЧрд░ рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:


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 { // This widget is the root of your application. @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> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: ListView(children: _getListData()), ); } _getListData() { List<Widget> widgets = []; for (int i = 0; i < 100; i++) { widgets.add(Padding(padding: EdgeInsets.all(10.0), child: Text("Row $i"))); } return widgets; } } 

рдкреНрд░рд╢реНрди:


рдХреИрд╕реЗ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХрд┐рд╕ рддрддреНрд╡ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рдЙрддреНрддрд░ рд╣реИ:


рдПрдХ GestureDetector рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рд▓рдкреЗрдЯрдирд╛ ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:


 import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { // This widget is the root of your application. @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> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: ListView(children: _getListData()), ); } _getListData() { List<Widget> widgets = []; for (int i = 0; i < 100; i++) { widgets.add(GestureDetector( child: Padding( padding: EdgeInsets.all(10.0), child: Text("Row $i")), onTap: () { print('row tapped'); }, )); } return widgets; } } 

рдкреНрд░рд╢реНрди:


рд▓рд┐рд╕реНрдЯ рд╡реНрдпреВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ ?

рдЙрддреНрддрд░ рд╣реИ:


рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╣реИ, рддреЛ рдпрд╣ setState () рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрджрд┐ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдмрдбрд╝рд╛ рд╣реИ, рддреЛ ListView.Builder рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ , рдЬреЛ RecyclerView рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг:


SetState рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ () :

 import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { // This widget is the root of your application. @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 = <Widget>[]; @override void initState() { super.initState(); for (int i = 0; i < 100; i++) { widgets.add(getRow(i)); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: ListView(children: widgets), ); } Widget getRow(int i) { return GestureDetector( child: Padding( padding: EdgeInsets.all(10.0), child: Text("Row $i")), onTap: () { setState(() { widgets = List.from(widgets); widgets.add(getRow(widgets.length + 1)); print('row $i'); }); }, ); } } 

ListView.Builder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ :

 import 'package:flutter/material.dart'; void main() { runApp(SampleApp()); } class SampleApp extends StatelessWidget { // This widget is the root of your application. @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 = <Widget>[]; @override void initState() { super.initState(); for (int i = 0; i < 100; i++) { widgets.add(getRow(i)); } } @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 GestureDetector( child: Padding( padding: EdgeInsets.all(10.0), child: Text("Row $i")), onTap: () { setState(() { widgets.add(getRow(widgets.length + 1)); print('row $i'); }); }, ); } } 

рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ


рдкреНрд░рд╢реНрди:


рдХрд╕реНрдЯрдо рдлреЛрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдЙрддреНрддрд░ рд╣реИ:


рдЖрдкрдХреЛ рдмрд╕ рдлреЙрдиреНрдЯ рдлрд╛рдЗрд▓ рдХреЛ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдЦреБрдж рдХреЗ рдирд╛рдо рдкрд░ рд╕реЛрдЪреЗрдВ) рдФрд░ 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 { // This widget is the root of your application. @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> { String _errorText; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center( child: TextField( onSubmitted: (String text) { setState(() { if (!isEmail(text)) { _errorText = 'Error: This is not an email'; } else { _errorText = null; } }); }, decoration: InputDecoration(hintText: "This is a hint", errorText: _getErrorText()), ), ), ); } _getErrorText() { return _errorText; } bool isEmail(String em) { String emailRegexp = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; RegExp regExp = RegExp(emailRegexp); return regExp.hasMatch(em); } } 

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!

Source: https://habr.com/ru/post/hi442432/


All Articles