我的代码的确切替换是:
main.dart:
import 'package:flutter/material.dart';
import 'BabyCard.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override _MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override Widget build(BuildContext context) => BabyPage();
}
class BabyPage extends StatefulWidget {
@override State<StatefulWidget> createState() => BabyCardState();
}
BabyCard.dart:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'BabyModel.dart';
class BabyCardState extends State {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Baby Name Votes')),
body: _buildBody(context),
);
}
Widget _buildBody(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('baby').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return LinearProgressIndicator();
return _buildList(context, snapshot.data.documents);
},
);
}
Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
return ListView(
padding: const EdgeInsets.only(top: 20.0),
children: snapshot.map((data) => _buildListItem(context, data)).toList(),
);
}
Widget _buildListItem(BuildContext context, DocumentSnapshot data) {
final baby = BabyData.fromSnapshot(data);
return Padding(
key: ValueKey(baby.name),
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(5.0),
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
ListTile(
leading: const Icon(Icons.album),
title: Text('The ${baby.name} is having:'),
subtitle: Text('${baby.votes} Votes.'),
trailing: Text(baby.votes.toString())
),
new ButtonTheme.bar(
child: new ButtonBar(
children: <Widget>[
FlatButton(
child: const Icon(Icons.thumb_up),
onPressed: () =>
Firestore.instance.runTransaction((
transaction) async {
final freshSnapshot = await transaction.get(
baby.reference);
final fresh = BabyData.fromSnapshot(
freshSnapshot);
await transaction
.update(
baby.reference, {'votes': fresh.votes + 1});
}),
),
FlatButton(
child: const Icon(Icons.thumbs_up_down),
onPressed: () {
print(baby);
},
),
FlatButton(
child: const Icon(Icons.thumb_down),
onPressed: () {
Firestore.instance.runTransaction((
transaction) async {
final freshSnapshot = await transaction.get(
baby.reference);
final fresh = BabyData.fromSnapshot(
freshSnapshot);
await transaction
.update(
baby.reference, {'votes': fresh.votes - 1});
});
},
)
])
)
]),
),
);
}
}
BabyModel.dart:
import 'package:cloud_firestore/cloud_firestore.dart';
class BabyData {
final String name;
final int votes;
final DocumentReference reference;
BabyData.fromMap(Map<String, dynamic> map, {this.reference}) :
name = (map['name'] ?? 'Frank'),
votes = (map['votes'] ?? 7);
BabyData.fromSnapshot(DocumentSnapshot snapshot)
: this.fromMap(snapshot.data, reference: snapshot.reference);
// if want to use: onTap: () => print(baby),
@override String toString() => "Record<$name:$votes>";
}
在android/app/src/gradle.build添加multiDexEnabled为:
android {
defaultConfig {
multiDexEnabled true
}
}
笔记
对于 Android,确保出现相同的包名称是:-manifiest-build.gradle-.kt/.java 文件