Flutter中使用GetX状态管理(更新中...)

几种方式:

   1.  Obx

   2.  GetX

   3.  GetBuilder

   4.  ValueBuilder(没搞懂,后面再补充)

   5.  worker

以模拟网络请求的例子来作测试,以下是几种方式的实现过程:

初始准备:

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:test_api_request/pages/homepage.dart';


Future<void> main() async {
  runApp(const MyApp());
}


class MyApp extends StatelessWidget {
  const MyApp({super.key});


  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: "Test Api Request",
      home: HomePage(),
    );
  }
}

还有一个Flutter对象类

一,使用Obx:

首先,为了调理清晰和方便重复调用,我先建立了两个文件,一个是homepage,另一个是homepage_controller
import 'dart:async';


import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;


import '../model/tab_data.dart';
import 'homepage_controller.dart';


class HomePage extends StatelessWidget {
  // 注册控制器实例,简单来说就是赋值,valueBuilder不需要
  final homePageController = Get.put(HomePageController());

  HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test Api Request"),
        centerTitle: true,
      ),
      body:  Obx(
        () => ListView(
          children: [
            Text(
                "Code: ${homePageController.newestDataInfo.value?.code ?? 'Loading...'}"),
            Text(
                "Result: ${homePageController.newestDataInfo.value?.result ?? 'Loading...'}"),
            Text(
                "Game Date: ${homePageController.newestDataInfo.value?.gameDate?.toString() ?? 'Loading...'}"),
            Text(
                "Bonus Info: ${homePageController.newestDataInfo.value?.bonusInfo?.totalIn ?? 'Loading...'}"),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: homePageController.getNewestDataFromUrl,
        child: const Icon(Icons.add),
      ),
    );
  }
}

homepage_controller

class HomePageController extends GetxController {
  Rx<TabData?> newestDataInfo = Rx<TabData?>(null);


  //Obx,GetX
  Future<void> getNewestDataFromUrl() async {
    final http.Response response =
        await http.get(Uri.parse('http://xxx.xxx.xx.xxx:xxxx/getnewestdata'));
    if (response.statusCode == 200) {
      final jsonData = response.body;
      newestDataInfo.value = newBarDataFromJson(jsonData);
    }
  }
}

二,使用GetX:

homepage_controller不变

homepage:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'homepage_controller.dart';

class HomePage extends StatelessWidget {
  // 注册控制器实例,简单来说就是赋值,valueBuilder不需要
  final homePageController = Get.put(HomePageController());

  HomePage({super.key});

  

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test Api Request"),
        centerTitle: true,
      ),
      //GetX使用示例
      body: GetX<HomePageController>(
        init: homePageController,
        // 初始化状态,需要加载的数据,这里可以实现局部刷新,就不需要使用initState了
        initState: (_) {
          homePageController.getNewestDataFromUrl();
        },
        dispose: (_) {
          homePageController.dispose();
        },
        builder: (homePageController) {
          return ListView(
            children: [
              Text(
                  "Code: ${homePageController.newestDataInfo.value?.code ?? 'Loading...'}"),
              Text(
                  "Result: ${homePageController.newestDataInfo.value?.result ?? 'Loading...'}"),
              Text(
                  "Game Date: ${homePageController.newestDataInfo.value?.gameDate?.toString() ?? 'Loading...'}"),
              Text(
                  "Bonus Info: ${homePageController.newestDataInfo.value?.bonusInfo?.totalIn ?? 'Loading...'}"),
            ],
          );
        },
      ),
      //加载数据按钮,如果你在GetX中已经设置了初始化便不再需要
      floatingActionButton: FloatingActionButton(
        onPressed: () => homePageController.getNewestDataFromUrl(),
        // Get.find<HomePageController>主要用于查找控制器实例,但是我们这里已经建立了一个
        // homePageController,所以不需要了
        // Get.find<HomePageController>().getNewestDataFromUrl(),
        child: const Icon(Icons.add),
      ),
    );
  }
}

三,使用GetBuilder

homepage

import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'homepage_controller.dart';

class HomePage extends StatelessWidget {
  // 注册控制器实例,简单来说就是赋值,valueBuilder不需要
  final homePageController = Get.put(HomePageController());

  HomePage({super.key});

 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test Api Request"),
        centerTitle: true,
      ),
      //GetBuilder实例
      body: GetBuilder<HomePageController>(
        init: homePageController,
        // 销毁控制器,
        dispose: (_) {
          homePageController.dispose();
        },
        // 类似StatefulWright的initState
        initState: (_) {
          homePageController.getNewestDataFromUrl();
        },
        builder: (homePageController) {
          return ListView(
            children: [
              Text(
                  "Code: ${homePageController.newestDataInfo.value?.code ?? 'Loading...'}"),
              Text(
                  "Result: ${homePageController.newestDataInfo.value?.result ?? 'Loading...'}"),
              Text(
                  "Game Date: ${homePageController.newestDataInfo.value?.gameDate?.toString() ?? 'Loading...'}"),
              Text(
                  "Bonus Info: ${homePageController.newestDataInfo.value?.bonusInfo?.totalIn ?? 'Loading...'}"),
            ],
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () => homePageController.getNewestDataFromUrl(),
        child: const Icon(Icons.add),
      ),
    );
  }
}

homepage_controller同上,但是要在方法结尾+update():

Future<void> getNewestDataFromUrl() async {
    final http.Response response =
        await http.get(Uri.parse('http://你的url/getnewestdata'));
    if (response.statusCode == 200) {
      final jsonData = response.body;
      newestDataInfo.value = newBarDataFromJson(jsonData);
      // 如果
      update();
    }
  }

四,ValueBuilder

五,Worker

homepage与obx保持一致...

homepage_controller:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'homepage_controller.dart';

class HomePage extends StatelessWidget {
  // 注册控制器实例,简单来说就是赋值,valueBuilder不需要
  final homePageController = Get.put(HomePageController());

  HomePage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Test Api Request"),
        centerTitle: true,
      ),
      body: Obx(
        () => ListView(
          children: [
            Text(
                "Code: ${homePageController.newestDataInfo.value?.code ?? 'Loading...'}"),
            Text(
                "Result: ${homePageController.newestDataInfo.value?.result ?? 'Loading...'}"),
            Text(
                "Game Date: ${homePageController.newestDataInfo.value?.gameDate?.toString() ?? 'Loading...'}"),
            Text(
                "Bonus Info: ${homePageController.newestDataInfo.value?.bonusInfo?.totalIn ?? 'Loading...'}"),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: homePageController.getNewestDataFromUrl,
        child: const Icon(Icons.add),
      ),
    );
  }
}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter 使用 GetX 库进行热更新,可以通过使用`flutter_getx`插件实现。以下是具体的实现步骤: 1. 在项目添加`flutter_getx`插件,可以在`pubspec.yaml`文件添加以下依赖: ```yaml dependencies: flutter_getx: ^1.0.0 ``` 然后执行`flutter pub get`命令安装插件。 2. 在项目添加热更新相关的代码,例如: ```dart import 'package:flutter_getx/flutter_getx.dart'; class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( title: 'MyApp', initialRoute: '/splash', getPages: [ GetPage(name: '/splash', page: () => SplashPage()), GetPage(name: '/home', page: () => HomePage()), ], smartManagement: SmartManagement.full, builder: EasyLoading.init(), ); } } ``` 在以上代码,`SmartManagement.full`表示启用全局状态管理,`EasyLoading.init()`是一个用于显示加载状态的插件,可以根据需要添加或删除。 3. 在服务器端准备新版本的资源文件,例如: ``` http://yourserver.com/app-release.apk ``` 4. 在客户端使用`flutter_getx`插件进行热更新,例如: ```dart import 'package:flutter_getx/flutter_getx.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await UpdateUtil.init( updateUrl: 'http://yourserver.com/app-release.apk', callback: () => runApp(MyApp()), ); } ``` 在以上代码,`UpdateUtil.init()`方法会检查服务器上是否有新版本的资源文件,如果有则下载并安装新版本,然后调用`callback`函数启动应用程序。如果没有新版本的资源文件,则直接启动应用程序。 注意:热更新只能更新资源文件(例如图片、字体、代码等),无法更新应用程序的逻辑代码。如果需要更新逻辑代码,可以考虑使用 Flutter 的动态插件机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值