flutter-狀態(tài)管理4-get的使用

一辣之、首先,依然是計(jì)數(shù)器的

1.構(gòu)建共享數(shù)據(jù)

  • update()
    使用GetBuilder 獲取共享數(shù)據(jù),并操作變化時(shí),需要執(zhí)行update()才能被通知到GetBuilder.
  • .obs
    給數(shù)據(jù)源加了.obs意味著 將其變成了rx響應(yīng)數(shù)據(jù)(此例子中即RxInt),可以直接使用Obx語法監(jiān)聽,并操作變化.無需調(diào)用update()方法

class CountController extends GetxController {
  var _counter = 0.obs;
  get counter => _counter;

  void increment() {
    _counter++;
    update();
  }

  @override
  void onInit() {
    super.onInit();
    print('CountController--onInit');
  }

  @override
  void onReady() {
    super.onReady();
    print('CountController--onReady');
  }

  @override
  void onClose() {
    super.onClose();
    print('CountController--onClose');
  }
}

2.獲取controller, 操作數(shù)據(jù)

使用GetBuilder獲取controller

1.需要在使用前 或 init參數(shù)中初始化共享數(shù)據(jù)Controller

(1) 使用前初始化的方式:CountController initController = Get.put(CountController());

(2) GetBuilder 的init參數(shù)初始化方式:

GetBuilder<CountController>(
       init: CountController(), //這里不初始化 , 就在上面初始化
       tag: "init_tag", //這里init不初始化,也不要設(shè)置這個(gè)tag; 設(shè)置了tag 數(shù)據(jù)就不是共享的了
        builder: ...
)
  • 2.獲取數(shù)據(jù)改變數(shù)據(jù)的方式:

(1)可以使用build內(nèi)返回的controller來獲取數(shù)據(jù)和改變數(shù)據(jù);
(2)可以用初始化initController獲取數(shù)據(jù)和改變數(shù)據(jù)
(3)可以用Get.find<CountController>()可以用來獲取數(shù)據(jù)和改變數(shù)據(jù)

class GetTestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('SimplePage--build');
    CountController initController = Get.put(CountController()); //初始化
       return GetBuilder<CountController>(
        //GetBuilder不監(jiān)聽obs更改,更改必須通過調(diào)用controller.update()
        // init: CountController(), //這里不初始化 , 就在上面初始化
        // tag: "init_tag", //這里init不初始化,也不要設(shè)置這個(gè)tag; 設(shè)置了tag 數(shù)據(jù)就不是共享的了
        builder: (controller) {
      print("GetBuilder--refresh");
      return Scaffold(
        appBar: AppBar(title: Text('Get')),
        body: Center(
            child: Column(children: [
          Text(
            controller.counter.toString(),
            style: TextStyle(fontSize: 30),
          ),
          Text(
            initController.counter.toString(),
            style: TextStyle(fontSize: 30),
          ),
          Text(
            Get.find<CountController>().counter.toString(),
            style: TextStyle(fontSize: 30),
          ),
          FloatingActionButton(
            heroTag: "get_test1_increment",
            onPressed: () {
              controller.increment();
              // initController.increment();
              // Get.find<CountController>().increment();
            },
            child: Icon(Icons.add),
          ),
           ])),
        floatingActionButton: FloatingActionButton(
          heroTag: "get_totest2",
          onPressed: () {
            Navigator.push(context, MaterialPageRoute(builder: (context) {
              return GetTest2Page();
            }));
          },
          child: Icon(Icons.next_plan),
        ),
      );
    });
  }
}

使用GetX獲取controller

  • 使用及注意事項(xiàng)與GetBuilder相同(需要初始化controller;改變數(shù)據(jù)及獲取數(shù)據(jù)的方式)
class GetTest2Page extends StatelessWidget {
  const GetTest2Page({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    CountController initController = Get.put(CountController()); //Obx需要初始化
    print('SimplePage2--build');
    return Scaffold(
      appBar: AppBar(title: Text('Get')),
      body: Center(
        child: Column(children: [
          GetX<CountController>(
            // init: CountController(),//默認(rèn)在這里初始化,不初始化的話,將會(huì)使用上邊初始化的Controller
            builder: (controller) {
              print('GetX--refresh');
              return TextButton(
                style: ButtonStyle(
                    backgroundColor: MaterialStateProperty.all(Colors.blue)),
                onPressed: () {
                  controller.increment();
                },
                child: Text(
                  '點(diǎn)擊+1-----${controller.counter}',
                  style: TextStyle(
                      fontWeight: FontWeight.bold, color: Colors.white),
                ),
              );
            },
          ),
          Obx(() => TextButton(
                style: ButtonStyle(
                    backgroundColor: MaterialStateProperty.all(Colors.blue)),
                onPressed: () {
                  initController.increment();
                },
                child: Text(
                  '點(diǎn)擊+1-----${initController.counter}',
                  style: TextStyle(
                      fontWeight: FontWeight.bold, color: Colors.white),
                ),
              )),
          Obx(() => Text(
            '僅顯示===${initController.counter}',
            style: TextStyle(
                fontWeight: FontWeight.bold, color: Colors.black),
          )),
          Obx(() => TextButton(
                style: ButtonStyle(
                    backgroundColor: MaterialStateProperty.all(Colors.blue)),
                onPressed: () {
                  Get.find<CountController>().increment();
                },
                child: Text(
                  '點(diǎn)擊+1-----${Get.find<CountController>().counter}',
                  style: TextStyle(
                      fontWeight: FontWeight.bold, color: Colors.white),
                ),
              )),
          TextButton(
            style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.blue)),
            onPressed: () {
              Get.find<CountController>().increment();
            },
            child: Text(
              '無法觀察變化 +1 -----${Get.find<CountController>().counter}',
              style:
                  TextStyle(fontWeight: FontWeight.bold, color: Colors.white),
            ),
          )
        ]),
      ),
    );
  }
}

使用Obx觀察數(shù)據(jù)

  • (1)數(shù)據(jù)源一定是Rx...(后面加.obs); 更新方法無需使用update()
  • (2)使用前一定要初始化controller
  • (3)Obx(() =>widget) widget內(nèi)可以展示數(shù)據(jù),改變數(shù)據(jù)

二篡帕、Get.find<CountController>()的內(nèi)部實(shí)現(xiàn)

  • (1)獲取數(shù)據(jù)改變數(shù)據(jù)既然可以直接使用Get.find<CountController>()拿到controller,就能改變數(shù)據(jù),展示數(shù)據(jù),為什么還要使用上述的3種方法?
    通過上面例子中的最后一個(gè) "無法觀察變化 +1"此按鈕可以看出,直接使用Get.find<CountController>()拿到的controller,可以改變數(shù)據(jù),但是這個(gè)按鈕本身并不具備觀察功能,改變數(shù)據(jù)時(shí),這個(gè)值并不會(huì)刷新.
  • (2)通過源碼可以看出,在初始化controller時(shí),Get.put內(nèi)部會(huì)先走_(dá)insert方法,然后走find方法,返回一個(gè)controller.
    CountController initController = Get.put(CountController());
    image.png

    _insert方法 內(nèi)部,會(huì)根據(jù)這個(gè)controller的tag或名字, 生成一個(gè)唯一key,并加入到_singl內(nèi).
    image.png

    find方法 會(huì)先從_initDependencies內(nèi)部尋找是否有對(duì)應(yīng)tag的controller可以返回(是否初始化,沒有的話先初始化);有的話,直接返回,沒有的話,通過key在_singl中拿到.
    image.png

    image.png

    所以,當(dāng)我們使用Get.find<CountController>()時(shí),也是這樣的調(diào)用流程,獲取到的controller.這個(gè)controller與其他方式獲取到的controller是同一個(gè)controller.

三异袄、實(shí)際使用,渲染一個(gè)列表-- obx方式

  • 1.共享數(shù)據(jù)
import 'package:get/get.dart';

class TestGetLogic extends GetxController {

  RxList _list = [].obs;
  get list => _list;

  addListData(List data){
    _list.addAll(data);
    // update();
  }

}
  • 2.使用頁面
class TestGetPage extends StatefulWidget {
  @override
  _TestGetPageState createState() => _TestGetPageState();
}

class _TestGetPageState extends State<TestGetPage> {
  TestGetLogic logic;

  _TestGetPageState() {
    logic = Get.put(TestGetLogic());
  }

  @override
  void initState() {
    ///模擬網(wǎng)絡(luò)請(qǐng)求,拿到數(shù)據(jù)
   Future.delayed(Duration(milliseconds: 360), () {
    logic.addListData(["達(dá)拉崩吧", "崩德比迪")]);
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: Column(
          children: [
            Obx(() { //Obx配合.obs 數(shù)據(jù)刷新
              return Text("${logic.list.length}");
            }),
            Obx(() {
              return Expanded(
                child: ListView.builder(
                    itemCount: logic.list.length,
                    itemBuilder: (context, index) {
                      return _listItem(logic.list[index]);
                    }),
              );
            }),
          ],
        ),
    );

//     body: GetBuilder<TestGetLogic>(
// builder: (controller) { //刷新需要配合update()
//   return ListView.builder(
//       itemCount: logic.list.length,
//     itemBuilder: (context, index) {
//       return _listItem("${logic.list[index]}");
//     });
// }));
  }

  Widget _listItem(String str) {
    return Padding(
      padding: const EdgeInsets.all(15.0),
      child: Container(
        padding: const EdgeInsets.all(5.0),
        color: Colors.black12,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              str,
              maxLines:1,
              style: TextStyle(fontSize: 18,fontWeight: FontWeight.w500),
            ),
          ],
        ),
      ),
    );
  }
}

問題

本例僅實(shí)現(xiàn)了向list里面增加數(shù)據(jù), 那如何清空數(shù)據(jù),修改數(shù)據(jù)呢 ?(以下示例無法實(shí)現(xiàn))
refreshListData(List data){
_list = data.obs;
}
removeAll(){
_list = [].obs;
}

歡迎點(diǎn)點(diǎn)小心心哦~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诉稍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猛们,老刑警劉巖起便,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚贾,死亡現(xiàn)場離奇詭異窖维,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鸟悴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門陈辱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人细诸,你說我怎么就攤上這事沛贪。” “怎么了震贵?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵利赋,是天一觀的道長。 經(jīng)常有香客問我猩系,道長媚送,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任寇甸,我火速辦了婚禮塘偎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拿霉。我一直安慰自己吟秩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布绽淘。 她就那樣靜靜地躺著涵防,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沪铭。 梳的紋絲不亂的頭發(fā)上壮池,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音杀怠,去河邊找鬼椰憋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赔退,可吹牛的內(nèi)容都是我干的熏矿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼离钝,長吁一口氣:“原來是場噩夢啊……” “哼票编!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卵渴,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤慧域,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浪读,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔榴,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辛藻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了互订。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吱肌。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仰禽,靈堂內(nèi)的尸體忽然破棺而出氮墨,到底是詐尸還是另有隱情,我是刑警寧澤吐葵,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布规揪,位于F島的核電站,受9級(jí)特大地震影響温峭,放射性物質(zhì)發(fā)生泄漏猛铅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一凤藏、第九天 我趴在偏房一處隱蔽的房頂上張望奸忽。 院中可真熱鬧,春花似錦揖庄、人聲如沸栗菜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛萎。三九已至桨昙,卻和暖如春检号,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛙酪。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工齐苛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桂塞。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓凹蜂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阁危。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玛痊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容