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