Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在颤振评级栏中保存用户评级?_Flutter_Material Design_Ratingbar - Fatal编程技术网

Flutter 如何在颤振评级栏中保存用户评级?

Flutter 如何在颤振评级栏中保存用户评级?,flutter,material-design,ratingbar,Flutter,Material Design,Ratingbar,我试图保存用户评分,以便在用户返回页面时显示。但我是一个不知道该怎么做的人。评级是有效的,但正如我所说,储蓄是无效的。 所以它总是空的。我真正想要的是,如果用户返回到页面,他会看到他的评分,如果他再次评分,评分与上次评分不同,我让他评分,如果不是,那么不是,如果他按clear,评分将删除同样有效的内容 也许任何人都可以帮忙 lass Ratingpage extends StatefulWidget { final int maximumRating; final Function(in

我试图保存用户评分,以便在用户返回页面时显示。但我是一个不知道该怎么做的人。评级是有效的,但正如我所说,储蓄是无效的。 所以它总是空的。我真正想要的是,如果用户返回到页面,他会看到他的评分,如果他再次评分,评分与上次评分不同,我让他评分,如果不是,那么不是,如果他按clear,评分将删除同样有效的内容

也许任何人都可以帮忙

lass Ratingpage extends StatefulWidget {
  final int maximumRating;
  final Function(int) onRatingSelected;

  Ratingpage(this.onRatingSelected, [this.maximumRating = 5]);

  @override
  _RatingpageState createState() => _RatingpageState();
}

class _RatingpageState extends State<Ratingpage> {
  int haveusercurrentchoice;

  int _currentRating = 0;

  Widget _buildRatingStar(int index) {
    if (index < _currentRating) {
      return Icon(
        Icons.star,
        color: Colors.yellow,
      );
    } else {
      return Icon(
        Icons.star,
        color: Colors.white,
      );
    }
  }

  Widget _buildBody() {
    final stars = List<Widget>.generate(this.widget.maximumRating, (index) {
      return Expanded(
        child: GestureDetector(
          child: _buildRatingStar(index),
          onTap: () {
            setState(() {
              _currentRating = index;
            });

            this.widget.onRatingSelected(_currentRating);
          },
        ),
      );
    });
    return Row(
      children: [
        Expanded(
          child: Row(
            children: stars,
          ),
        ),
        Expanded(
          child: TextButton(
            onPressed: () {
              setState(() {
                _currentRating = 0;
              });

              this.widget.onRatingSelected(_currentRating);
            },
            child: Text(
              "Clear",
              style: TextStyle(color: Colors.white),
            ),
          ),
        ),
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return _buildBody();
  }

它实际上在一个列中,所以你有一个在页面之间存储状态的问题,然后你有一个在应用程序重新启动时存储评级的问题。两件不同的事情。您可能只关心前者,但下面介绍如何使用和使用本地数据库存储。同样的事情也可以通过任何其他状态管理解决方案来完成,如提供商、Riverpod、Bloc等

GetStorage可以与
SharedReferences
互换,但我认为任何使用过这两种引用的人都会同意
GetStorage
更易于使用

为了澄清我的例子,我去掉了任何对完成你的要求不必要的东西。根据应用程序其余部分的情况,您可能不需要恢复我消除的大部分或所有变量

首先,让我们将逻辑和变量移动到GetX类中,以便从应用程序中的任何位置都可以访问它们。它还有助于清理您的UI代码

class RatingController extends GetxController {
  int currentRating = 0;
  final box = GetStorage();

  @override
  void onInit() { // called whenever we initialize the controller
    super.onInit();
    currentRating = box.read('rating') ?? 0; // initializing current rating from storage or 0 if storage is null
  }

  void updateAndStoreRating(int rating) {
    currentRating = rating;
    box.write('rating', rating); // stores to local database
    update(); // triggers a rebuild of the GetBuilder Widget
  }

  Widget buildRatingStar(int index) {
    if (index < currentRating) {
      return Icon(
        Icons.star,
        color: Colors.yellow,
      );
    } else {
      return Icon(
        Icons.star,
        color: Colors.white,
      );
    }
  }
}
同样,仅为了简化路由,我们使用
GetMaterialApp
并在那里定义页面

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Material App',
      home: Ratingpage(),
      getPages: [ // only necessary for routing, not for storage or state management
        GetPage(name: OtherPage.id, page: () => OtherPage()),
        GetPage(name: Ratingpage.id, page: () => Ratingpage()),
      ],
    );
  }
}
编辑:添加了
SharedReferences
,原因是未维护的包与GetStorage path提供程序依赖项冲突

添加
SharedReferences优先权到您的GetX类

这是您现在的更新功能

void updateAndStoreRating(int rating) {
    currentRating = rating;
    prefs.setInt('rating', rating); //SharedPreferences way
    update(); // triggers a rebuild of the GetBuilder Widget
  }
在GetX控制器类中添加init函数

 Future<void> initSp() async {
    prefs = await SharedPreferences.getInstance();
    currentRating = prefs.getInt('rating') ?? 0;
  }

Hello@dfgdfv通常状态不保存在GUI中,而是保存在外部类中;为了简单起见,您可以创建一个静态类,其作用类似于全局变量;我不知道您是如何返回到该页面的,但如果再次创建该页面,如果不将其保存在某个位置,则会丢失该值。您是否尝试将评级(int)存储在
共享参考文件中?并在用户导航到页面时检索它<代码>共享首选项
我会更新我的代码,这样你就可以看到我是如何调用页面的。我没有尝试过分享偏好,但实际上我是新来的,不知道如何做到这一点?对Camille777来说,你的想法是保存价值,就像在firebase中一样,然后像印刷品一样?如果我理解正确的话,我真的不太明白。哦,天哪,你的天才,但你能告诉我如何在有共同偏好的情况下做到这一点吗?因为我的pubsec让我在尝试使用GetStorage版本1.4.0安装get-storageTry时遇到问题,因为所有较新的版本都是用于转换为空安全的项目,我猜这是你的问题。我已经尝试过了。没有帮助什么错误?这是颤振共享和路径提供程序以及
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Material App',
      home: Ratingpage(),
      getPages: [ // only necessary for routing, not for storage or state management
        GetPage(name: OtherPage.id, page: () => OtherPage()),
        GetPage(name: Ratingpage.id, page: () => Ratingpage()),
      ],
    );
  }
}
void updateAndStoreRating(int rating) {
    currentRating = rating;
    prefs.setInt('rating', rating); //SharedPreferences way
    update(); // triggers a rebuild of the GetBuilder Widget
  }
 Future<void> initSp() async {
    prefs = await SharedPreferences.getInstance();
    currentRating = prefs.getInt('rating') ?? 0;
  }
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  final controller = Get.put(RatingController());
  await controller.initSp();

  runApp(MyApp());
}