Flutter评分功能插件rating的使用
Flutter评分功能插件rating的使用
特性


开始使用
在 pubspec.yaml
文件中添加依赖:
dependencies:
rating: <latest_version>
然后运行 flutter pub get
。
使用方法
实现 RatingController
首先,创建一个自定义的 RatingController
类,该类实现了 RatingController
抽象类,并覆盖了必要的回调方法。
class PrintRatingController extends RatingController {
PrintRatingController(RatingModel ratingModel) : super(ratingModel);
[@override](/user/override)
Future<void> ignoreForEverCallback() async {
print('Rating ignored forever!');
await Future.delayed(const Duration(seconds: 3));
}
[@override](/user/override)
Future<void> saveRatingCallback(int rate, List<RatingCriterionModel> selectedCriterions) async {
print('Rating saved!\nRate: $rate\nSelected Items: $selectedCriterions');
await Future.delayed(const Duration(seconds: 3));
}
}
创建 RatingModel
接下来,创建一个 RatingModel
对象,用于存储评分的相关信息。
final ratingModel = RatingModel(
id: 1,
title: null,
subtitle: 'Classifique nosso app:',
ratingConfig: RatingConfigModel(
id: 1,
ratingSurvey1: 'Em que podemos melhorar?',
ratingSurvey2: 'Em que podemos melhorar?',
ratingSurvey3: 'Em que podemos melhorar?',
ratingSurvey4: 'Em que podemos melhorar?',
ratingSurvey5: 'O que você mais gostou?',
items: [
RatingCriterionModel(id: 1, name: 'Qualidade do atendimento'),
RatingCriterionModel(id: 2, name: 'Competência dos atendentes'),
RatingCriterionModel(id: 3, name: 'Limpeza do ambiente'),
RatingCriterionModel(id: 4, name: 'Tempo de espera'),
],
),
);
显示 Rating Widget
最后,通过 showModalBottomSheet
函数显示评分组件。这里我们使用之前创建的 PrintRatingController
和 RatingModel
。
showModalBottomSheet(
context: context,
builder: (context) => RatingWidget(controller: PrintRatingController(ratingModel)),
);
完整示例代码
以下是一个完整的示例代码,展示了如何在应用中集成评分功能。
// ignore_for_file: avoid_print
import 'package:flutter/material.dart';
import 'package:rating/rating.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
[@override](/user/override)
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with TickerProviderStateMixin {
final scaffoldKey = GlobalKey<ScaffoldState>();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldKey,
appBar: AppBar(title: const Text('Rating Test')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
child: const Text('Rate with modal bottom sheet'),
onPressed: () {
final ratingModel = RatingModel(
id: 1,
title: null,
subtitle: 'Classifique nosso app:',
ratingConfig: RatingConfigModel(
id: 1,
ratingSurvey1: 'Em que podemos melhorar?',
ratingSurvey2: 'Em que podemos melhorar?',
ratingSurvey3: 'Em que podemos melhorar?',
ratingSurvey4: 'Em que podemos melhorar?',
ratingSurvey5: 'O que você mais gostou?',
items: [
RatingCriterionModel(id: 1, name: 'Qualidade do atendimento'),
RatingCriterionModel(id: 2, name: 'Competência dos atendentes'),
RatingCriterionModel(id: 3, name: 'Limpeza do ambiente'),
RatingCriterionModel(id: 4, name: 'Tempo de espera'),
],
),
);
showModalBottomSheet(
context: context,
builder: (context) => RatingWidget(controller: MockRatingController(ratingModel)),
);
},
),
const SizedBox(height: 25),
// To use custom duration, is necessary creating a new AnimationController.
// The AnimationController needs the TickerProviderStateMixin mixin into current class
ElevatedButton(
child: const Text('Rate with Custom Duration'),
onPressed: () {
final ratingModel = RatingModel(
id: 1,
title: 'Deivão Store',
subtitle: 'Classifique este estabelecimento',
ratingConfig: RatingConfigModel(
id: 1,
ratingSurvey1: 'Em que podemos melhorar?',
ratingSurvey2: 'Em que podemos melhorar?',
ratingSurvey3: 'Em que podemos melhorar?',
ratingSurvey4: 'Em que podemos melhorar?',
ratingSurvey5: 'O que você mais gostou?',
items: [
RatingCriterionModel(id: 1, name: 'Qualidade do atendimento'),
RatingCriterionModel(id: 2, name: 'Competência dos atendentes'),
RatingCriterionModel(id: 3, name: 'Limpeza do ambiente'),
RatingCriterionModel(id: 4, name: 'Tempo de espera'),
],
),
);
scaffoldKey.currentState?.showBottomSheet(
(context) => RatingWidget(controller: MockRatingController(ratingModel)),
transitionAnimationController: AnimationController(vsync: this, duration: const Duration(milliseconds: 500)),
);
},
),
const SizedBox(height: 25),
ElevatedButton(
child: const Text('Rate with Scaffold Key'),
onPressed: () {
final ratingModel = RatingModel(
id: 1,
title: 'Deixe sua nota',
subtitle: 'Está gostando do app?',
ratingConfig: RatingConfigModel(
id: 1,
ratingSurvey1: 'Em que podemos melhorar?',
ratingSurvey2: 'Em que podemos melhorar?',
ratingSurvey3: 'Em que podemos melhorar?',
ratingSurvey4: 'Em que podemos melhorar?',
ratingSurvey5: 'O que você mais gostou?',
items: [
RatingCriterionModel(id: 1, name: 'Qualidade do atendimento'),
RatingCriterionModel(id: 2, name: 'Competência dos atendentes'),
RatingCriterionModel(id: 3, name: 'Limpeza do ambiente'),
RatingCriterionModel(id: 4, name: 'Tempo de espera'),
],
),
);
scaffoldKey.currentState?.showBottomSheet(
(context) => RatingWidget(controller: MockRatingController(ratingModel)),
);
},
),
const SizedBox(height: 25),
// For found the current Scaffold by the context, is necessary create a new context scope.
// For create new context scope, we can use the Builder widget.
Builder(builder: (context) {
return ElevatedButton(
child: const Text('Rate with current Scaffold'),
onPressed: () {
final ratingModel = RatingModel(
id: 1,
title: null,
subtitle: 'Classifique nosso app:',
ratingConfig: RatingConfigModel(
id: 1,
ratingSurvey1: 'Em que podemos melhorar?',
ratingSurvey2: 'Em que podemos melhorar?',
ratingSurvey3: 'Em que podemos melhorar?',
ratingSurvey4: 'Em que podemos melhorar?',
ratingSurvey5: 'O que você mais gostou?',
items: [
RatingCriterionModel(id: 1, name: 'Qualidade do atendimento'),
RatingCriterionModel(id: 2, name: 'Competência dos atendentes'),
RatingCriterionModel(id: 3, name: 'Limpeza do ambiente'),
RatingCriterionModel(id: 4, name: 'Tempo de espera'),
],
),
);
Scaffold.of(context).showBottomSheet(
(context) => RatingWidget(controller: MockRatingController(ratingModel)),
);
},
);
}),
],
),
),
);
}
}
class MockRatingController extends RatingController {
MockRatingController(RatingModel ratingModel) : super(ratingModel);
[@override](/user/override)
Future<void> ignoreForEverCallback() async {
print('Rating ignored forever!');
await Future.delayed(const Duration(seconds: 3));
}
[@override](/user/override)
Future<void> saveRatingCallback(int rate, List<RatingCriterionModel> selectedCriterions) async {
print('Rating saved!\nRate: $rate\nSelected Items: $selectedCriterions');
await Future.delayed(const Duration(seconds: 3));
}
}
更多关于Flutter评分功能插件rating的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter评分功能插件rating的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,你可以使用rating_bar
或flutter_rating_bar
等插件来实现评分功能。以下是使用flutter_rating_bar
插件来实现评分功能的步骤:
1. 添加依赖
首先,在pubspec.yaml
文件中添加flutter_rating_bar
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_rating_bar: ^4.0.0 # 请检查最新版本
然后运行flutter pub get
来获取依赖。
2. 导入包
在需要使用评分功能的Dart文件中导入flutter_rating_bar
包:
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
3. 使用RatingBar
组件
你可以在你的UI中使用RatingBar
组件来实现评分功能。以下是一个简单的示例:
import 'package:flutter/material.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
class RatingExample extends StatefulWidget {
[@override](/user/override)
_RatingExampleState createState() => _RatingExampleState();
}
class _RatingExampleState extends State<RatingExample> {
double _rating = 0;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Rating Bar Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RatingBar.builder(
initialRating: _rating,
minRating: 1,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemPadding: EdgeInsets.symmetric(horizontal: 4.0),
itemBuilder: (context, _) => Icon(
Icons.star,
color: Colors.amber,
),
onRatingUpdate: (rating) {
setState(() {
_rating = rating;
});
},
),
SizedBox(height: 20),
Text(
'Rating: $_rating',
style: TextStyle(fontSize: 20),
),
],
),
),
);
}
}
void main() => runApp(MaterialApp(
home: RatingExample(),
));