Flutterflutter

flutter-状态管理4-get的使用

2021-04-02  本文已影响0人  浮华_du

一、首先,依然是计数器的

1.构建共享数据


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, 操作数据

使用GetBuilder获取controller

1.需要在使用前 或 init参数中初始化共享数据Controller

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

(2) GetBuilder 的init参数初始化方式:

GetBuilder<CountController>(
       init: CountController(), //这里不初始化 , 就在上面初始化
       tag: "init_tag", //这里init不初始化,也不要设置这个tag; 设置了tag 数据就不是共享的了
        builder: ...
)

(1)可以使用build内返回的controller来获取数据和改变数据;
(2)可以用初始化initController获取数据和改变数据
(3)可以用Get.find<CountController>()可以用来获取数据和改变数据

class GetTestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print('SimplePage--build');
    CountController initController = Get.put(CountController()); //初始化
       return GetBuilder<CountController>(
        //GetBuilder不监听obs更改,更改必须通过调用controller.update()
        // init: CountController(), //这里不初始化 , 就在上面初始化
        // tag: "init_tag", //这里init不初始化,也不要设置这个tag; 设置了tag 数据就不是共享的了
        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

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(),//默认在这里初始化,不初始化的话,将会使用上边初始化的Controller
            builder: (controller) {
              print('GetX--refresh');
              return TextButton(
                style: ButtonStyle(
                    backgroundColor: MaterialStateProperty.all(Colors.blue)),
                onPressed: () {
                  controller.increment();
                },
                child: Text(
                  '点击+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(
                  '点击+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(
                  '点击+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观察数据

二、Get.find<CountController>()的内部实现

三、实际使用,渲染一个列表-- obx方式

import 'package:get/get.dart';

class TestGetLogic extends GetxController {

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

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

}
class TestGetPage extends StatefulWidget {
  @override
  _TestGetPageState createState() => _TestGetPageState();
}

class _TestGetPageState extends State<TestGetPage> {
  TestGetLogic logic;

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

  @override
  void initState() {
    ///模拟网络请求,拿到数据
   Future.delayed(Duration(milliseconds: 360), () {
    logic.addListData(["达拉崩吧", "崩德比迪")]);
    });
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: Column(
          children: [
            Obx(() { //Obx配合.obs 数据刷新
              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),
            ),
          ],
        ),
      ),
    );
  }
}

问题

本例仅实现了向list里面增加数据, 那如何清空数据,修改数据呢 ?(以下示例无法实现)
refreshListData(List data){
_list = data.obs;
}
removeAll(){
_list = [].obs;
}

欢迎点点小心心哦~

上一篇下一篇

猜你喜欢

热点阅读