論在flutter裡面使用全域性變數
先定義一下,什麼是全域性變數,我大概這樣定義: 變數不會被銷燬,多個檔案訪問同一個變數
在web裡面,js有window物件,只要介面不重新整理,是spa應用它就不會被幹掉,在裡面可以為所欲為,很好理解。
可是在dart裡面,可沒有這個東西,愁死我了。
往期文章
flutter - sqlite資料庫小白入門
flutter-讀寫二進位制檔案到裝置
flutter-登入token本地儲存(shared_preferences)、路由攔截
需求
整個app裡面,只需要執行一次的東西多了去了,比如請求
、sqlite
、navigatorKey
這幾個東西在前面幾個文章都說過了,但是一直沒有正視初始化
然後應該怎麼做了,搜尋,尋找方法
尋找仙丹
搜出來有這些東西
可以看出,有InheritedWidget
這個玩意。
其他的文章點開都是這麼寫,要麼是狀態管理之類的。
而InheritedWidget是基於widget的高階產物,說白了就是裡面的一種通訊方法,本質上也是層層傳遞。
這時候我們需要全域性變數,怎麼辦。
冷靜分析
1,它支援全域性變數
2,它不支援全域性變數
如果支援,那麼找到方法,如果不支援,那麼一定是通過資料層層傳遞,總不能飛吧。
除了這個就是硬體支援,直接寫入本地。但是這個不能滿足需求,本地只能進行序列化,然後再反系列化,而且很麻煩。
看了上面的文章,有大概方法的就是這個文章了
可是這貨,好像是存到本地,看到他用了SharedPreferences.
難道他不是靠這個實現的,只是對全域性變數的定義不一樣??
正文
在flutter裡面,多個檔案引用同一個dart檔案,只會執行一次。變數是共享的。
(也就是,什麼都不用做)
驗證
新建一個dart檔案
在A介面修改值(A.dart)
在B介面獲取值(B.dart)
然後看下執行結果
嗯,修改了。。他們確實使用同一個變數。
應用
sqlite
db.dart
複製程式碼
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
Database db;
Future<String> initDB()async{
return new Future(() async{
String table_book_name = 'books';
String createSql = '''
CREATE TABLE $table_book_name (
id INTEGER,
bookname STRING,
);
''';
// 初始化
db = await openDatabase(
join(await getDatabasesPath(), '.db'),
onCreate: (Database db, int version) async{
// 新建表
db.execute(createSql);
},
version: 1,
);
});
}
複製程式碼
入口引入,然後執行initDB
其他介面引入db.dart,然後直接使用db
其他
感謝這兩位flutter群友