Flutter进阶—Firebase数据库实例
如果需要使用Firebase实时数据库。首先我们需要为项目配置Firebase,具体配置方法可以在《Flutter实战一Flutter聊天应用(五)》查看,因为我们只需要使用Firebase数据库,所以 name: talk_casually
description: A new flutter project.
dependencies: flutter: sdk: flutter firebase_database: ^0.0.4
首先我们修改项目的 import 'dart:async';
import 'package:flutter/material.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_database/ui/firebase_animated_list.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter数据库实例',home: new MyHomePage(),);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: const Text('Flutter数据库实例'),),);
}
}
打开Firebase控制台,更改Firebase实时数据库的安全规则,选择“Database > 规则”,规则如下所示。 {
"rules": { "counter":{ ".read": true,".write": true },"messages":{ ".read": true,".write": true } } }
现在我们需要使用 class _MyHomePageState extends State<MyHomePage> {
//...
final DatabaseReference _counterRef = FirebaseDatabase.instance.reference().child('counter');
final DatabaseReference _messagesRef = FirebaseDatabase.instance.reference().child('messages');
//...
}
我们先增加一个 class _MyHomePageState extends State<MyHomePage> {
//...
int _counter;
//...
@override
void initState() {
super.initState();
FirebaseDatabase.instance.setPersistenceEnabled(true);
}
//...
}
现在我们的应用程序中,Firebase数据库客户端将缓存同步的数据,并跟踪用户在应用程序运行时发起的所有写入。当网络连接恢复时,它可以无缝地处理间歇性网络连接并重新发送写入操作。默认情况下,Firebase数据库客户端将使用高达10MB的磁盘空间来缓存数据。如果缓存增长超过此大小,客户端将开始删除尚未使用的数据。如果发现应用程序缓存数据太少或太多,可以使用 class _MyHomePageState extends State<MyHomePage> {
//...
@override
void initState() {
super.initState();
FirebaseDatabase.instance.setPersistenceEnabled(true);
FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000);
}
//...
}
如果操作成功,则Future将返回 class _MyHomePageState extends State<MyHomePage> {
//...
@override
void initState() {
super.initState();
FirebaseDatabase.instance.setPersistenceEnabled(true);
FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000);
_counterRef.keepSynced(true);
}
//...
}
通过在某个位置调用 现在我们增加两个 class _MyHomePageState extends State<MyHomePage> {
//...
StreamSubscription<Event> _counterSubscription;
StreamSubscription<Event> _messagesSubscription;
//...
}
现在需要在应用程序启动时读取按钮被点击的次数。 class _MyHomePageState extends State<MyHomePage> {
//...
@override
void initState() {
//...
_counterSubscription = _counterRef.onValue.listen((Event event) {
setState(() {
_counter = event.snapshot.value ?? 0;
});
});
}
//...
}
上面代码中的双问号操作符意思是取所赋值??左边的,如果左边为null,取所赋值??右边的。应用程序在启动时还应该获取消息列表,还可以打印在控制台上。 class _MyHomePageState extends State<MyHomePage> {
//...
@override
void initState() {
//...
_messagesSubscription = _messagesRef.limitToLast(10).onChildAdded.listen((Event event) {
print('子数据增加了: ${event.snapshot.value}');
});
}
//...
}
在资源使用完之后及时关闭是一个良好的习惯, class _MyHomePageState extends State<MyHomePage> {
//...
@override
void dispose() {
super.dispose();
_messagesSubscription.cancel();
_counterSubscription.cancel();
}
//...
}
修改 class _MyHomePageState extends State<MyHomePage> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: const Text('Flutter数据库实例'),body: new Column(
children: <Widget>[
new Flexible(
child: new Center(
child: new Text(
'按钮点击 $_counter 次,nn该统计包括所有的终端!',],);
}
//...
}
再增加一个 class _MyHomePageState extends State<MyHomePage> {
//...
bool _anchorToBottom = false;
//...
}
修改 class _MyHomePageState extends State<MyHomePage> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
//...
body: new Column(
children: <Widget>[
//...
new ListTile(
leading: new Checkbox(
onChanged: (bool value) {
setState(() {
_anchorToBottom = value;
});
},value: _anchorToBottom,title: const Text('锚点到底部'),);
}
//...
}
现在可以使用 class _MyHomePageState extends State<MyHomePage> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
//...
body: new Column(
children: <Widget>[
//...
new Flexible(
child: new FirebaseAnimatedList(
key: new ValueKey<bool>(_anchorToBottom),query: _messagesRef,reverse: _anchorToBottom,sort: _anchorToBottom
? (DataSnapshot a,DataSnapshot b) => b.key.compareTo(a.key)
: null,itemBuilder: (BuildContext context,DataSnapshot snapshot,Animation<double> animation) {
return new SizeTransition(
sizeFactor: animation,child: new Text(snapshot.value.toString()),);
},)
],);
}
//...
}
在 我们需要编写一个提交事件,用于将数据上传到数据库。 class _MyHomePageState extends State<MyHomePage> {
//...
String _kTestKey = 'Hello';
String _kTestValue = 'world!';
//...
Future<Null> _increment() async {
final DataSnapshot snapshot = await _counterRef.once();
setState(() {
_counter = (snapshot.value ?? 0) + 1;
});
_counterRef.set(_counter);
_messagesRef.push().set(<String,String>{_kTestKey: '$_kTestValue $_counter'});
}
//...
}
最后我们修改 class _MyHomePageState extends State<MyHomePage> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: const Text('Flutter数据库实例'),body: new Column(
//...
),floatingActionButton: new FloatingActionButton(
onPressed: _increment,tooltip: '增加',child: new Icon(Icons.add),);
}
//...
}
启动应用程序,点击按钮三次,控制台与终端的显示如下: 数据库内容显示如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |