flutter 裡面的全域性變數(給web開發者)

秀嶽lonelyBoy發表於2019-11-22

論在flutter裡面使用全域性變數

先定義一下,什麼是全域性變數,我大概這樣定義: 變數不會被銷燬,多個檔案訪問同一個變數

在web裡面,js有window物件,只要介面不重新整理,是spa應用它就不會被幹掉,在裡面可以為所欲為,很好理解。

可是在dart裡面,可沒有這個東西,愁死我了。

往期文章

flutter - sqlite資料庫小白入門
flutter-讀寫二進位制檔案到裝置
flutter-登入token本地儲存(shared_preferences)、路由攔截

需求

整個app裡面,只需要執行一次的東西多了去了,比如請求sqlitenavigatorKey

這幾個東西在前面幾個文章都說過了,但是一直沒有正視初始化

然後應該怎麼做了,搜尋,尋找方法

尋找仙丹

搜出來有這些東西

flutter 裡面的全域性變數(給web開發者)

可以看出,有InheritedWidget這個玩意。

其他的文章點開都是這麼寫,要麼是狀態管理之類的。

而InheritedWidget是基於widget的高階產物,說白了就是裡面的一種通訊方法,本質上也是層層傳遞。

這時候我們需要全域性變數,怎麼辦。

冷靜分析

1,它支援全域性變數
2,它不支援全域性變數

如果支援,那麼找到方法,如果不支援,那麼一定是通過資料層層傳遞,總不能飛吧。

除了這個就是硬體支援,直接寫入本地。但是這個不能滿足需求,本地只能進行序列化,然後再反系列化,而且很麻煩。

看了上面的文章,有大概方法的就是這個文章了

flutter 裡面的全域性變數(給web開發者)

可是這貨,好像是存到本地,看到他用了SharedPreferences.

難道他不是靠這個實現的,只是對全域性變數的定義不一樣??

正文

在flutter裡面,多個檔案引用同一個dart檔案,只會執行一次。變數是共享的。

(也就是,什麼都不用做)

驗證

新建一個dart檔案

flutter 裡面的全域性變數(給web開發者)

在A介面修改值(A.dart)

flutter 裡面的全域性變數(給web開發者)

在B介面獲取值(B.dart)

flutter 裡面的全域性變數(給web開發者)

然後看下執行結果

flutter 裡面的全域性變數(給web開發者)

嗯,修改了。。他們確實使用同一個變數。

應用

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群友

感謝這兩位flutter群友

相關文章