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 函数显示评分组件。这里我们使用之前创建的 PrintRatingControllerRatingModel

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

1 回复

更多关于Flutter评分功能插件rating的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,你可以使用rating_barflutter_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(),
));
回到顶部