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

рд▓рдВрдмреЗ рд╡рд┐рд░рд╛рдо рдХреЗ рдмрд╛рдж, рдореИрдВ рдкреНрд░рд╢реНрди-рдЙрддреНрддрд░ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рдлрд╝реНрд▓рдЯрд░ рдврд╛рдВрдЪреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛ред рдЖрдк рдпрд╣рд╛рдВ рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЬ рдЖрдИрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рд╣реЛрдЧреАред

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



рд╕реНрдкрдВрджрдиред рднрд╛рдЧ 1. Android рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП
рд╕реНрдкрдВрджрдиред рднрд╛рдЧ 2. рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП
рд╕реНрдкрдВрджрдиред рднрд╛рдЧ 3. рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдиреЗрдЯрд┐рд╡ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП
рд╕реНрдкрдВрджрдиред рднрд╛рдЧ 4. рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП
рд╕реНрдкрдВрджрдиред рднрд╛рдЧ 5. рдЬрд╝рд╛рдорд░реАрди рдХреЗ рд▓рд┐рдП

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


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

  2. рдиреЗрд╡рд┐рдЧреЗрд╢рди

  3. рдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛

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

  5. ViewControllers

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

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

  8. рдЖрд╡реЗрджрди рд╕реНрдЯрд╛рдЗрд▓

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

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

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

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



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


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


рд╕реНрдкрдВрджрди рдореЗрдВ UIView рдПрдирд╛рд▓реЙрдЧ рдХреНрдпрд╛ рд╣реИ?

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


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

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


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

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

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


рд╕реНрдкрдВрджрди рдореЗрдВ рдХреНрдпреВрдкрд░реНрдЯрд┐рдиреЛ рд╡рд┐рдЬреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рдореЗрдВ рд╡реЗ рд╡рд┐рдЬреЗрдЯреНрд╕ рд╣реИрдВ рдЬреЛ Apple Design рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ред

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


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

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


StatefulWidget рдФрд░ рдЙрд╕рдХреЗ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╕реНрдкрдВрджрди рдореЗрдВ 2 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдЬреЗрдЯ рд╣реИрдВ: рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдбрдЧреЗрдЯ рдФрд░ рд╕реНрдЯреЗрдЯрдлреБрд▓рд╡реЗрдЯ ред рд╡реЗ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рд░рд╛рдЬреНрдп рдореЗрдВ рд╣реИред

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


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

StatefulWidget рдореЗрдВ рд░рд╛рдЬреНрдп рд░рд╛рдЬреНрдп рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддреЗ рд╕рдордп рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдХ рддрддреНрд╡ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЖрдИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛, рдЖрджрд┐) - рдпрд╣ рдЖрдкрдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред

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


1) рд╕реНрдЯреЗрдЯрд▓реЗрд╕рд╡рд┐рдЬреЗрдЯ - рдЯреЗрдХреНрд╕реНрдЯ

Text( 'I like Flutter!', style: TextStyle(fontWeight: FontWeight.bold), ); 

2) StatefulWidget - рдЬрдм рдЖрдк (FloatingActionButton) рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ 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), ), ); } } 

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


рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдХреЛ рдХреИрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдХрд░реЗрдВ? рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╣рд╛рдВ рд╣реИ?

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


рд╕реНрдкрдВрджрди рдореЗрдВ рдХреЛрдИ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдирд╣реАрдВ рд╣реИред рд╡рд┐рдЬреЗрдЯ рдЯреНрд░реА рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реАрдзреЗ рдХреЛрдб рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред

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


 @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center( child: CupertinoButton( onPressed: () { setState(() { _pressedCount += 1; }); }, child: Text('Hello'), padding: EdgeInsets.only(left: 10.0, right: 10.0), ), ), ); } 

рд╕реНрдкрдВрджрди рдореЗрдВ рд╕рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡рд┐рдЬреЗрдЯ рд╡рд┐рдЬреЗрдЯ рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

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


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдПрдХ рдШрдЯрдХ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ рдпрд╛ рдирд┐рдХрд╛рд▓реЗрдВ?

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


рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдЬреЗрдЯ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред

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


IOS рдкрд░, рдЖрдк addSubview () рдпрд╛ removeFromSuperview () рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди рдореЗрдВ, рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╡рд┐рдЧреЗрдЯреНрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИрдВред рдХреЗрд╡рд▓ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рд╕рдХрддреА рд╣реИред

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


рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧрдПрд╢рдирдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдмрдЯрди рдореЗрдВ рдмрджрд▓реЗрдВред

 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> { // Default value for toggle bool toggle = true; void _toggle() { setState(() { toggle = !toggle; }); } _getToggleChild() { if (toggle) { return Text('Toggle One'); } else { return CupertinoButton( 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 рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред

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


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

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


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

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


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

 class SampleApp 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() { 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(); }, ), ); } @override dispose() { controller.dispose(); super.dispose(); } } 

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


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

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


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

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


рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдХреИрдирд╡рд╕ рдкрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд░реНрдЧ рд╣реИрдВ: рдХрд╕реНрдЯрдордкреЗрдВрдЯ рдФрд░ рдХрд╕реНрдЯрдордкреИрдиреНрдЯрд░ ред рджреВрд╕рд░рд╛ рдЖрдкрдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝реЗрдВ: StackOverflow

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


 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 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), ); } } 

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


рд╡рд┐рдЧреЗрдЯреНрд╕ рдХреА рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреИрд╕реЗ рдмрджрд▓реЗрдВ?

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


рдЕрдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред

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


IOS рдкрд░, рд╕рднреА рджреГрд╢реНрдпреЛрдВ рдореЗрдВ .opacity рдпрд╛ .alpha рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЖрд╡рд░рдг рд╡рд┐рдЬреЗрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред

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


рдХрд╕реНрдЯрдо рд╡рд┐рдЬреЗрдЯ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ?

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


рд╡рд┐рдЬреЗрдЯ рдХреЛ рдПрдХ рдХреЗ рдЕрдВрджрд░ (рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдмрдЬрд╛рдп) рд▓рд┐рдЦреЗрдВред

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


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

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


 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"), ); } 

рдиреЗрд╡рд┐рдЧреЗрд╢рди


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


рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ?

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


рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдФрд░ рд░реВрдЯ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред

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


рд╕реНрдкрдВрджрди рдореЗрдВ UIViewController рдФрд░ UINavigationController рдЬреИрд╕реА рдХреЛрдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ (рдиреЗрд╡рд┐рдЧреЗрдЯрд░) рдФрд░ рд░реВрдЯ (рд░реВрдЯ) рд╣реИрдВред рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ UINavigationController рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рд░реНрдЧ рдкрд░ рдкреБрд╢ () рдпрд╛ рдкреЙрдк () рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд░реВрдЯ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ UIViewController рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдпрд╛ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИред

рд╕реНрдкрдВрджрди рдХреЗ рджреЛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рддрд░реАрдХреЗ рд╣реИрдВ:

  • рдорд╛рд░реНрдЧ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ
  • рд╕реАрдзреЗ рд░реВрдЯ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВред

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


 void main() { runApp(CupertinoApp( 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 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ iOS рд▓реЗрдпрд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╛ URL рд▓реЙрдиреНрдЪрд░ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

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


IOS ViewController рдореЗрдВ рдкреЙрдк рд╡рд╛рдкрд╕ рдХреИрд╕реЗ рдХрд░реЗрдВ?

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


SystemNavigator.pop () рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗред

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


Dart рдХреЛрдб рд╕реЗ SystemNavigator.pop () iOS рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╣рддрд╛ рд╣реИ:
 UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; if ([viewController isKindOfClass:[UINavigationController class]]) { [((UINavigationController*)viewController) popViewControllerAnimated:NO]; } 

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

рдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛


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


рд╕реНрдкрдВрджрди рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ?

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


рдбрд╛рд░реНрдЯ рдЖрдЗрд╕реЛрд▓реЗрдЯреНрд╕ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк 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); }); } } 

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


рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рдореЗрдВ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ?

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


рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдФрд░ рдЖрдЗрд╕реЛрд▓реЗрд╢рди (рдЖрдЗрд╕реЛрд▓реЗрдЯ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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


IOS рдкрд░ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рдЖрдк рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкреБрди: рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрдкрдВрджрди "рдЖрдЙрдЯ рдСрдл рдж рдмреЙрдХреНрд╕" рдореЗрдВ рдЖрдкрдХреЛ рдмрд╕ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдбрд╛рд░реНрдЯ рдмрд╛рдХреА рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред

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


рдпрд╣рд╛рдБ 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; } } 

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


рд╕реНрдкрдВрджрди рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рдХрд░реЗрдВ?

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


рд╕реНрдкрдВрджрди рдХрд╛ рдЕрдкрдирд╛ HTTP рдкреИрдХреЗрдЬ рд╣реИ ред

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


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); }); } } 

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


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


рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ?

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


рд╕рдВрдкрддреНрддрд┐ рдореЗрдВред

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


IOS рдореЗрдВ, рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ Images.xcasset рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрд╕реЗрдЯреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИред рд╕рдВрд╕рд╛рдзрди рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╣реАрдВ рднреА рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ pubspec.yaml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЗрд╕реЗ рдкрде рд▓рд┐рдЦреЗрдВред

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


рдЖрдИрдУрдПрд╕ рдФрд░ рдлреНрд▓рдЯрд░ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЖрдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдШрдирддреНрд╡-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд╛рди:

 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.png 

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) 

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


CocoaPods рдХреЗ рд▓рд┐рдП рд╕рдордХрдХреНрд╖ рдХреНрдпрд╛ рд╣реИ? рдирд┐рд░реНрднрд░рддрд╛ рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ?

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


pubspec.yamlред

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


рд╕реНрдкрдВрджрди рдирд┐рд░реНрдорд╛рдг рдХреЛ рджреЗрд╢реА рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рдЖрдИрдУрдПрд╕ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЛ рд╕реМрдВрдкрддрд╛ рд╣реИред рдкрдм рдореЗрдВ рдлрд╝реНрд▓рдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦреЗрдВред

ViewControllers


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


рд╕реНрдкрдВрджрди рдореЗрдВ ViewController рдХреЗ рдмрд░рд╛рдмрд░ рдХреНрдпрд╛ рд╣реИ?

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


рд╕реНрдкрдВрджрди рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡рд┐рдЧреЗрдЯреНрд╕ рд╣реИред UI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ViewController рдХреА рднреВрдорд┐рдХрд╛ рд╡рд┐рдЧреЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рднрд╛рдИ рдЬрд╛рддреА рд╣реИред рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреА рднреВрдорд┐рдХрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИ, рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдФрд░ рд░реВрдЯ рд╣реИред

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


рдЬреАрд╡рди рдЪрдХреНрд░ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдВ?

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


WidgetsBinding рдФрд░ didChangeAppLifecycleState () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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


рдлрд╝реНрд▓рдЯрд░ рджреЗрд╢реА рдХреЛрдб рдореЗрдВ FlutterAppDelegate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд╝реНрд▓рдЯрд░ рдЗрдВрдЬрди рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЬреАрд╡рди рдЪрдХреНрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ:

  • рдирд┐рд╖реНрдХреНрд░рд┐рдп - рдЖрд╡реЗрджрди рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреЗрд╡рд▓ рдЖрдИрдУрдПрд╕ рдореЗрдВ рд╣реИ, рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИ;
  • рд░реБрдХрд╛ рд╣реБрдЖ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ;
  • рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ - рдЖрд╡реЗрджрди рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдкреНрд░рддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ;
  • рдирд┐рд▓рдВрдмрд┐рдд - рд░реЛрдХрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрд╡реЗрджрдиред рдпрд╣ рд░рд╛рдЬреНрдп рдХреЗрд╡рд▓ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рд╣реИ, рдЖрдИрдУрдПрд╕ рдореЗрдВ рдХреЛрдИ рдПрдирд╛рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИред

рдпрд╣ 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())); } 

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


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


UITableView рдФрд░ UICollectionView рдХреЗ рдмрд░рд╛рдмрд░ рдХреНрдпрд╛ рд╣реИ?

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


ListView ред

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


 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; } } 

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


рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

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


рд╡рд┐рдЬреЗрдЯ, рдЬреЛ рд╕реВрдЪреА рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИ, рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

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


IOS рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ рджреГрд╢реНрдп: didSelectRowAtIndexPath: рд╡рд┐рдзрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╕реНрдкрдВрджрди рдореЗрдВ, рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЛ рдПрдХ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд▓рдкреЗрдЯрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ GestureDetector ред

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


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

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


рдбреЗрдЯрд╛ рд╕реВрдЪреА рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВ рдФрд░ setState () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред

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


IOS рдкрд░, рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдкреБрдирдГ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝реНрд▓рдЯрд░ рдореЗрдВ, 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 = []; @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 = []; @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'); }); }, ); } } 


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


UIScrollView рдХреЗ рд╕рдорддреБрд▓реНрдп рдХреНрдпрд╛ рд╣реИ?

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


рд╡рд┐рдЬреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рджреЗрдЦреЗрдВред

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


 @override Widget build(BuildContext context) { return ListView( children: <Widget>[ Text('Row One'), Text('Row Two'), Text('Row Three'), Text('Row Four'), ], ); } 


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


рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдБ ред

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


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


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(); } }, ), ), ); } } 


рдЖрд╡реЗрджрди рд╕реНрдЯрд╛рдЗрд▓


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


рдРрдк рдореЗрдВ рдереАрдо (рдереАрдо) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

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


рдЖрд╡реЗрджрди рдореЗрдВ рд░реВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ MaterialApp рд╡рд┐рдЬреЗрдЯ рдпрд╛ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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


 class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample App', theme: ThemeData( primarySwatch: Colors.blue, textSelectionColor: Colors.red ), home: SampleAppPage(), ); } } 


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


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

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


рдЖрдкрдХреЛ рдмрд╕ рдлреЙрдиреНрдЯ рдлрд╛рдЗрд▓ рдХреЛ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдЦреБрдж рдХрд╛ рдирд╛рдо рд╕реЛрдЪреЗрдВ) рдФрд░ 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ред


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


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


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдкрд░рд┐рдгрд╛рдо рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ?

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


TextEditingController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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

 class _MyFormState extends State<MyForm> { // Create a text controller and use it to retrieve the current value. // of the TextField! final myController = TextEditingController(); @override void dispose() { // Clean up the controller when disposing of the Widget. myController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Retrieve Text Input'), ), body: Padding( padding: const EdgeInsets.all(16.0), child: TextField( controller: myController, ), ), floatingActionButton: FloatingActionButton( // When the user presses the button, show an alert dialog with the // text the user has typed into our text field. onPressed: () { return showDialog( context: context, builder: (context) { return AlertDialog( // Retrieve the text the user has typed in using our // TextEditingController content: Text(myController.text), ); }, ); }, tooltip: 'Show me the value!', child: Icon(Icons.text_fields), ), ); } } 


: Retrieve the value of a text field .

:


hint TextInput ?

:


InputDecoration , .

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


 body: Center( child: TextField( decoration: InputDecoration(hintText: "This is a hint"), ), ) 

:


?

:


тАФ InputDecoration .

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


 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 emailString) { 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(emailString); } } 

Flutter


:


GPS?

:


geolocator .

:


?

:


image_picker .

:


Facebook?

:


flutter_facebook_login .

:


Firebase?

:


Firebase Flutter first party plugins :


:


() ?

:


Flutter EventBus . : developing packages and plugins .


:


UserDefault?

:


Shared_Preferences plugin ( Shared Preferences Android ).

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


 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); } 

:


Core Data ?

:


SQFlite .


:


push-?

:


Firebase_Messaging .

рдирд┐рд╖реНрдХрд░реНрд╖


. , , . ┬л ┬╗ . ┬л-┬╗ . , ? 2016 Kotlin, - 2017. , , . , .
2016 Flutter Dart. , 2018 . . ! , , , . ( Google Fuchsia , , , Flutter ). тАФ ! , тАФ . . Apple Store!

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


All Articles