สำหรับคนที่รู้จัก Android อยู่แล้ว:
UI - Android ต้องการการรวม XML ในขณะที่ทุกอย่างเป็นวิดเจ็ตใน Flutter และสามารถทำในไฟล์เดียว
ผู้ฟัง ไม่มีผู้ฟังอีกต่อไปสำหรับ onclicks โทรหาวิธีเปลี่ยนสถานะและเพลิดเพลินกับมุมมอง
FindView - ไม่มี FindViewById () อีกต่อไป - เพียงทำทุกอย่างในวิดเจ็ต () {} และปล่อยให้การค้นหา Android
Gradle - ไม่มีปัญหา Gradle เพิ่มเติม - เพิ่มการพึ่งพาในไฟล์ pubspec.yaml และรีเฟรชแอปพลิเคชันเพื่อใช้ไลบรารีใหม่
สินทรัพย์ - จะต้องมีการจัดการแยกต่างหากในกระพือคุณต้องประกาศทุกสิ่งที่คุณใช้ - สำหรับเช่นรูปภาพ, แบบอักษร ใน Android คุณสามารถเพิ่มในส่วนไฟล์และใช้งานได้
ภาพเคลื่อนไหว นั้นง่ายกว่ามากและรองรับได้ดีในการใช้งานพื้นฐาน - การใช้งานขั้นพื้นฐาน - เช่นกิจกรรมสาด, แท็บปัด, ผลลัพธ์, หน้าการวิเคราะห์, การนำทาง
การรันแอพ - การโหลดซ้ำในกระพือ - เพียงแค่กด 'R' สำหรับการโหลดซ้ำและ 'R' สำหรับการรีสตาร์ทของแอปพลิเคชัน Android Studio อาจใช้เวลาไม่เกิน 20-30 วินาทีสำหรับการโหลดซ้ำแต่ละครั้งและยิ่งกว่านั้นหากมีปัญหา Gradle ซึ่งป๊อปอัปทุกครั้ง
API - Android API สามารถทำได้ด้วยไลบรารีที่แตกต่างกันเช่นชุดติดตั้งเพิ่มเติมโดยใช้ GSON ในขณะที่การดึงข้อมูลในกระพือสามารถทำได้โดยไม่ต้องเจ็บปวดใด ๆ ฟังก์ชั่นการดึงข้อมูลทั่วไปสามารถใช้ในการกระพือและมีวิธีการรอการเรียกใช้ APIs
มุมมอง Recycler/List - มุมมอง Recycler ใช้ใน Android เพื่อสร้างรายการที่แตกต่างกันบนหน้าจอ เราต้องการอะแดปเตอร์สำหรับสิ่งที่มีอินเทอร์เฟซและเราจำเป็นต้องรู้ฟังก์ชั่นที่แตกต่างกันทุกประเภทเพื่อนำไปใช้งานอย่างสมบูรณ์ Flutter เพียงแค่มีวิดเจ็ตสำหรับ ListView ที่เราสามารถกำหนดรายการที่แตกต่างกันหรือเพียงแค่เพิ่มสิ่งของแบบไดนามิก ง่ายกว่ามากดูง่ายขึ้น
การเรียนรู้เส้นโค้ง - การทำงานในกระพือนั้นง่ายขึ้นเมื่อคุณรู้จัก DART ซึ่งคล้ายกับ JavaScript และเข้าใจแนวคิดพื้นฐานเกี่ยวกับวิดเจ็ต Android ช่วยให้คุณสร้างเลย์เอาต์ด้วยความช่วยเหลือของนักออกแบบซึ่งสามารถใช้ในการสร้างเค้าโครงข้อ จำกัด การสร้างแอปพลิเคชันขั้นพื้นฐานนั้นง่ายต่อการเรียนรู้ใน Android แต่เมื่อเราลึกลงไปในชิ้นส่วนและสิ่งอื่น ๆ มันเริ่มซับซ้อน
ชิ้นส่วนเทียบกับส่วนประกอบ (วิดเจ็ต) - เราสามารถใช้ส่วนประกอบวิดเจ็ตได้ทุกที่ที่เราต้องการแตกต่างจากชิ้นส่วนที่เราทำใน Android ซึ่งต้องการความรู้บางอย่างก่อนที่จะใช้วิธีการใช้ชุดข้อมูลอะแดปเตอร์, เลย์เอาต์ XML และวิธีการต่าง ๆ เช่น OnCreateView
ฐานข้อมูล SQL - มันค่อนข้างคล้ายกันทั้งในเทคโนโลยี ความแตกต่างเพียงอย่างเดียวคือการจัดการสถานะสามารถเกิดขึ้นได้หากคุณพยายามเพิ่มบางสิ่งบางอย่างติดต่อกันคุณจะต้องจัดเก็บคีย์ในสถานะและเปลี่ยนโดยใช้ setState () {_ key+= 1} -> เพียงกรณีการใช้งาน ห้องสมุดห้องใน Android ใช้งานได้ค่อนข้างกว้างและใช้งานง่ายเช่นกัน
รูปแบบสถาปัตยกรรม - ทุกอย่างเดือดลงไปที่ MVP/ MVVM/ MVC ใน Android ในขณะที่เรามีกลุ่มและผู้ให้บริการใน Flutter ซึ่งทำสิ่งที่คล้ายกับ MVC แยกตรรกะทางธุรกิจโดยการสร้างอ่างล้างมือและลำธาร
Code Editor - VSCODE/Android Studio - Flutter และ Android Studio สำหรับ Android
การเริ่มต้นคู่มือ - ตรงไปตรงมาสำหรับ Android ดาวน์โหลดสตูดิโอและเริ่มต้นในขณะที่คุณต้องทำสิ่งต่าง ๆ มากมายสำหรับ Flutter - อาจน่ารำคาญ
Firebase - ทรัพยากรสำหรับ Flutter Firebase: -
https://firebase.google.com/docs/flutter/setup
https://flutter.dev/docs/development/data-and-backend/firebase
https://www.youtube.com/watch?v=8M-FA239HY4
https://www.youtube.com/channel/ucftm1fgjzskospdzgtbp7ha/search?query=firebase
https://codelabs.developers.google.com/codelabs/flutter-firebase/#0
การเชื่อมต่อ Firebase - ง่ายต่อการใช้งานสำหรับ Flutter คุณสามารถทำได้ในรหัส 20 บรรทัดขึ้นอยู่กับมุมมองรายการที่คุณทำ พื้นฐานเหมือนกันคุณต้องใช้ไฟล์. json และต้องเพิ่มลงในคอนโซล Firebase การเข้ารหัสใน Flutter ช่วยให้คุณเข้าใจในวิธีที่ดีกว่ามาก โดยรวมแล้วมันคล้ายกัน
รายการ + Firebase - Android มีมุมมอง Recycler ที่บ้าคลั่งซึ่งทำให้ทุกอย่างยากและการรวม Firebase + Recycler View มีบทความประมาณ 200 บทความและคุณไม่สามารถเชี่ยวชาญได้ ไม่มีทางที่ฉันจะนำบางสิ่งบางอย่างใน Android ได้โดยไม่ต้องสอน แต่ใน Flutter คุณสามารถลองได้ตลอดเวลา
การดึงข้อมูลการผลักดัน - การผลักข้อมูลนั้นง่ายกว่าใน Flutter Firebase มีวิธี ONTAP () อย่างแท้จริงซึ่งช่วยให้คุณสามารถส่งสแนปช็อตของข้อมูล
การเรียนรู้ของเครื่อง - บูรณาการการเรียนรู้ของเครื่องจักร
UI - Flutter และ RN มีระบบไฟล์เดียวที่คุณกำหนดกฎและ UI โดยส่วนตัวแล้วฉันชอบอินเทอร์เฟซสำหรับแอพพลิเคชั่น Flutter ตามที่กำหนดไว้มากขึ้น นอกจากนี้ยังได้รับการดูแลโดย Google ซึ่งเป็นเจ้าของ Android และสามารถรวมเข้ากับ Google ได้ดีขึ้นมาก
คลาส - Flutter ใช้วิดเจ็ตสำหรับทุกอย่างอย่างแท้จริงตั้งแต่ TextViews ไปจนถึง TabViews - พวกเขาเรียกว่า 'วิดเจ็ต' Flutter ใช้ DART ในขณะที่ React Native ใช้ TypeScript หรือ JavaScript
ส่วนประกอบ - RN มีส่วนประกอบและเราต้องนำเข้าจาก 'react -native' เพื่อใช้พวกเขา Flutter มีวิดเจ็ตซึ่งสามารถใช้ในพื้นที่ใกล้เคียงกัน ทั้งคู่มีความคล้ายคลึงกันยกเว้นสไตล์และส่วนการแสดงผล
สไตล์ Flutter - วิดเจ็ตด้านใน - ดังนั้นหากคุณต้องการ padding => คุณห่อวิดเจ็ตในวิดเจ็ต () ที่มีแผ่นรองบางส่วนตอบสนองพื้นเมือง: คุณกำหนดสไตล์ const: Stylesheet และเพิ่มสไตล์ของคุณที่นั่น - คล้ายกับสไตล์เว็บที่คุณมี CSS ดังนั้น React Native จึงมีสไตล์ CSS ในขณะที่ Flutter มีสไตล์ 'วิดเจ็ต'
แอนิเมชั่น - Flutter นั้นง่ายกว่ามากในขณะที่ React Native มีแง่มุมที่กว้างขึ้น
เส้นโค้งการเรียนรู้ - คล้ายกันใน React Native และ Flutter
Libraries - NPM ช่วยในการตอบสนอง Native ในขณะที่ Flutter เราเพิ่งเพิ่มลงในไฟล์ pubspec.yaml
APIS - ทั้งคู่มีวิสัยทัศน์ที่ชัดเจนในการใช้ API บทความที่ดีสำหรับ RN-https://medium.com/better-programming/handling-api-like-a-boss-in-ract-native-364abd92dc3d
Code Editor - VS Code เป็นที่นิยมสำหรับทั้งคู่
การเริ่มต้น - โดยส่วนตัวแล้วมันยากมากที่จะทำงานกับ React Native บน Windows จะดีกว่ามากถ้าคุณใช้ Mac แต่โดยรวมแล้วหน้าจอสีแดงทำให้คุณรำคาญมาก Flutter ไม่มีคู่มือการเริ่มต้นใช้งานที่ง่ายที่สุด แต่มีการสนับสนุนที่นั่นเพื่อช่วยคุณ
โดยรวม - ทั้งคู่สามารถสร้างแอพข้ามเนทีฟและฉันจะเลือก Flutter Anyday - Hackathons/ Projects/ เรียนรู้ Android เช่นกัน



fetch () async {
var url = "API-HERE" ;
var res = await http. get (url);
var body = jsonDecode (res.body);
// body is your API body
}content description ลงในปุ่ม TextView ฯลฯ ใน Android สำหรับ Voice Overs https://steemit.com/utopian-io/@tensor/advanced-flutter-project ---best-practices--generic-loc-providers-part-Three
class App extends StatelessWidget {
@override
Widget build ( BuildContext context) {
// TODO: implement build
return MaterialApp (
home : Home (),
theme : ThemeData (primaryColor : PrimaryColor ), //add-your-color here || or remove this
debugShowCheckedModeBanner : false ,
);
}
}
class Home extends StatefulWidget {
@override
State < StatefulWidget > createState () {
// TODO: implement createState
return new _HomeState ();
}
}
class _HomeState extends State < Home >{
@override
Widget build ( BuildContext context) {
return Scaffold (
body : Column ()
);
}child : users.length <= 0
? Center (
child : EmptyState (
title : 'Oops' ,
message : 'Add form by tapping add button below' ,
),
)
: ListView . builder (
addAutomaticKeepAlives : true ,
itemCount : users.length,
itemBuilder : (_, i) => users[i],
),
) fetch () async {
var url = "API-HERE" ;
var res = await http. get (url);
var body = jsonDecode (res.body);
// body is your API body
} for ( int i = 0 ;i < body[ 0 ][ 'staggered_tiles' ].length;i ++ ){
_staggeredTiles. add ( new StaggeredTile . count (
body[ 0 ][ 'staggered_tiles' ][i][ 'cross_axis' ], // body is what we get from the API
body[ 0 ][ 'staggered_tiles' ][i][ 'main_axis' ] // body is what we get from the API
));
}
if (body[i][ 0 ][ 'type' ] == 'donut' ) {
List < LabelPieSales > _d = [];
for ( int j = 0 ; j < body[i][ 0 ][ 'data' ].length; j ++ ) {
_d. add ( new LabelPieSales (
body[i][ 0 ][ 'data' ][j][ 'year' ], body[i][ 0 ][ 'data' ][j][ 'sales' ])); // body is what we get from the API
}
_wid_top. add ( new Container (
height : 200 ,
width : 200 ,
child : DonutChartWidget . withSampleData (_d),
));
}
else if (body[i][ 0 ][ 'type' ] == 'label-pie' ) {
List < LabelPieSales > _d = [];
for ( int j = 0 ; j < body[i][ 0 ][ 'data' ].length; j ++ ) {
_d. add ( new LabelPieSales (
body[i][ 0 ][ 'data' ][j][ 'year' ], body[i][ 0 ][ 'data' ][j][ 'sales' ])); // body is what we get from the API
}
_wid_top. add ( new Container (
height : 200 ,
width : 200 ,
child : SimpleBarChart . withSampleData (_d),
));
} return Container (
padding : const EdgeInsets . all ( 4.0 ),
child : appState.isFetching
? CircularProgressIndicator ()
: appState. getResponseJson () != null
? ListView . builder (
primary : false ,
shrinkWrap : true ,
itemCount : appState. getResponseJson ().length,
itemBuilder : (context, index) {
return Container (
height : 100 ,
width : 100 ,
child : graph (appState. getResponseJson ()),
);
},
)
: Text ( "Press Button above to fetch data" ),
); initDB () async {
return await openDatabase (
join ( await getDatabasesPath (), 'graphs_database.db' ),
onCreate : (db, version) {
return db. execute (
"CREATE TABLE graphs(id INTEGER PRIMARY KEY, type TEXT)" ,
);
},
version : 1 ,
);
}floatingActionButton : FloatingActionButton (
child : Icon ( Icons .add),
onPressed : () async {
Dog dog = new Dog (id : _id, name : "name" ,age : 22 );
await insertDog (dog);
setState (() {
_id += 1 ;
});
},
), List < Graph > graphs_sql = await graphs ();
List < String > graphs_sql_types = [];
for ( int i = 0 ;i < graphs_sql.length;i ++ ){
graphs_sql_types. add (graphs_sql[i].type);
}
if (graphs_sql.length != _types.length) {
for ( int i = 0 ; i < _types.length; i ++ ) {
if ( ! graphs_sql_types. contains (_types[i])){ // add only if a new type
await insertGraph ( new Graph (id : i, type : _types[i]));
}
}
} launchUrl () {
setState (() {
urlString = controller.text;
flutterWebviewPlugin. reloadUrl (urlString);
});
} class News {
String dateAdded;
String title;
String body;
String level;
String category;
News ( this .dateAdded, this .title, this .body, this .level, this .category);
}
class Record {
final String name;
final int votes;
final DocumentReference reference;
Record . fromMap ( Map < String , dynamic > map, { this .reference})
: assert (map[ 'name' ] != null ),
assert (map[ 'votes' ] != null ),
name = map[ 'name' ],
votes = map[ 'votes' ];
Record . fromSnapshot ( DocumentSnapshot snapshot)
: this . fromMap (snapshot.data, reference : snapshot.reference);
@override
String toString () => "Record<$ name :$ votes >" ;
} double _height = MediaQuery . of (context).size.height;
double _width = MediaQuery . of (context).size.width; @override
void initState () {
// TODO: implement initState
super . initState ();
_image = {url};
localList1 = globalList1;
localList1 = globalList2;
} export const sendToTopic = functions.firestore
.document( 'recipes/{recipyId}' )
.onCreate(async snapshot => {
// const recipe = snapshot.data();
const payload : admin.messaging.MessagingPayload = {
notification: {
title: 'new recipe added, check it out' ,
body: 'Make it and eat it'
}
};
return fcm. sendToTopic ( 'recipes' , payload);
}); @override
Widget build ( BuildContext context) {
return Scaffold (
appBar : AppBar (title : Text ( 'Recipes for you' )),
body : _buildBody (context),
);
}
Widget _buildBody ( BuildContext context) {
return StreamBuilder < QuerySnapshot >(
stream : Firestore .instance. collection ( 'recipes' ). snapshots (),
builder : (context, snapshot) {
if ( ! snapshot.hasData) return LinearProgressIndicator ();
return _buildList (context, snapshot.data.documents);
},
);
} List<Recipe> recipe_list = [];
// snapshot.map((data) => recipeList(context, data).toList());
for(int i=0;i<snapshot.length;i++){
Recipe recipe = Recipe.fromSnapshot(snapshot[i]);
recipe_list.add(recipe);
}
return AsymmetricView(products: recipe_list,);