【问题标题】:The argument type 'RemoteMessage' can't be assigned to the parameter type 'Map<String?, dynamic>'参数类型“RemoteMessage”不能分配给参数类型“Map<String?, dynamic>”
【发布时间】:2021-09-17 10:59:43
【问题描述】:

我对颤动很陌生。任何人都可以为我在代码中遇到的错误“无法将参数类型'RemoteMessage'分配给参数类型'Map'”提出解决方案。第 20 行和第 25 行 / pushNotificationService.dart。 谢谢

我的代码如下:

main.dart

import 'package:driver/AllScreens/carInfoScreen.dart';
import 'package:driver/configMaps.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:driver/AllScreens/mainScreen.dart';
import 'package:driver/AllScreens/registrationScreen.dart';
import 'package:driver/DataHandler/appData.dart';

import 'AllScreens/loginScreen.dart';

Future<void> backgroundHandler(RemoteMessage message) async
{
  print(message.data.toString());
  print(message.notification!.title);
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  FirebaseMessaging.onBackgroundMessage(backgroundHandler);
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  currentFirebaseUser = FirebaseAuth.instance.currentUser;
  runApp(MyApp());
}

DatabaseReference usersRef = FirebaseDatabase.instance.reference().child("users");
DatabaseReference driversRef = FirebaseDatabase.instance.reference().child("drivers");
DatabaseReference newRequestRef = FirebaseDatabase.instance.reference().child("Ride Requests");
DatabaseReference rideRequestRef = FirebaseDatabase.instance.reference().child("drivers").child(currentFirebaseUser!.uid).child("newRide");

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => AppData(),
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Driver',
        theme: ThemeData(
          primarySwatch: Colors.green,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        initialRoute: FirebaseAuth.instance.currentUser == null ? LoginScreen.idScreen : MainScreen.idScreen,
        routes: {
          RegistrationScreen.idScreen: (context) => RegistrationScreen(),
          LoginScreen.idScreen: (context) => LoginScreen(),
          MainScreen.idScreen: (context) => MainScreen(),
          CarInfoS`enter code here`creen.idScreen: (context) => CarInfoScreen(),
        },
      ),
    );
  }
}

pushNotification.dart

    import 'package:driver/Models/rideDetails.dart';
    import 'package:driver/configMaps.dart';
    import 'package:driver/main.dart';
    import 'package:firebase_database/firebase_database.dart';
    import 'package:firebase_messaging/firebase_messaging.dart';
    import 'package:google_maps_flutter/google_maps_flutter.dart';
    import 'dart:io' show Platform;
    
    class PushNotificationService {
    
      final FirebaseMessaging firebaseMessaging = FirebaseMessaging.instance;
    
      Future initialize(context) async {
    
        FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    
          RemoteNotification? notification = message.notification;
    
          retrieveRideRequestInfo(getRideRequestId(message));
        });
    
        FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
    
          retrieveRideRequestInfo(getRideRequestId(message));
        });
      }
    
      Future<String?> getToken() async {
        String? token = await firebaseMessaging.getToken();
        driversRef.child(currentFirebaseUser!.uid).child("token").set(token);
    
        firebaseMessaging.subscribeToTopic("alldrivers");
        firebaseMessaging.subscribeToTopic("allusers");
      }
    
      String getRideRequestId(Map<String?, dynamic> message) {
    
        String rideRequestId = "";
    
        if (Platform.isAndroid) {
          rideRequestId = message['data']['ride_request_id'];
        } else {
          rideRequestId = message['ride_request_id'];
        }
        return rideRequestId;
      }
    
      void retrieveRideRequestInfo(String rideRequestId) {
        newRequestRef.child(rideRequestId).once().then((DataSnapshot dataSnapshot) {
          if (dataSnapshot.value != null) {
            double pickupLocationLat =
                double.parse(dataSnapshot.value['pickup']['latitude'].toString());
            double pickupLocationLng =
                double.parse(dataSnapshot.value['pickup']['longitude'].toString());
            String pickupAddress = dataSnapshot.value['pickup_address'].toString();
    
            double dropoffLocationLat =
                double.parse(dataSnapshot.value['dropoff']['latitude'].toString());
            double dropoffLocationLng =
                double.parse(dataSnapshot.value['dropoff']['longitude'].toString());
            String dropoffAddress =
                dataSnapshot.value['dropoff_address'].toString();
    
            String paymentMethod = dataSnapshot.value['payment_method'].toString();
    
            String rider_name = dataSnapshot.value["rider_name"].toString();
            String rider_phone = dataSnapshot.value["rider_phone"].toString();
    
            RideDetails rideDetails = RideDetails();
            rideDetails.ride_request_id = rideRequestId;
            rideDetails.pickup_address = pickupAddress;
            rideDetails.dropoff_address = dropoffAddress;
            rideDetails.pickup = LatLng(pickupLocationLat, pickupLocationLng);
            rideDetails.dropoff = LatLng(dropoffLocationLat, dropoffLocationLng);
            rideDetails.payment_method = paymentMethod;
            rideDetails.rider_name = rider_name;
            rideDetails.rider_phone = rider_phone;
    
            print("Information :: ");
            print(rideDetails.pickup_address);
            print(rideDetails.dropoff_address);
          }
        });
      }
    }
    
    rideDetails.dart
    
    import 'package:google_maps_flutter/google_maps_flutter.dart';
    
    class RideDetails {
      String? pickup_address;
      String? dropoff_address;
      LatLng? pickup;
      LatLng? dropoff;
      String? ride_request_id;
      String? payment_method;
      String? rider_name;
      String? rider_phone;
    
      RideDetails({this.pickup_address,this.dropoff_address, this.pickup, this.dropoff, this.ride_request_id, this.payment_method, this.rider_name, this.rider_phone});
    }

【问题讨论】:

    标签: flutter dart push-notification firebase-cloud-messaging


    【解决方案1】:

    从,

    String getRideRequestId(Map<String?, dynamic> message) {}
    

    到,

    String getRideRequestId(var message) {}
    

    对于控制台中的打印请求, 试试这个,

    if (Platform.isAndroid) {
      rideRequestId = message.data['ride_request_id'];
    } else {
      rideRequestId = message['ride_request_id'];
    }
    print("Print Notification Data:" + rideRequestId);
    return rideRequestId;
    }   
        
    

    【讨论】:

    • 消息已发送到手机,但显示另一个错误为:New Ride Request E/flutter (32202): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception :NoSuchMethodError:类“RemoteMessage”没有实例方法“[]”。 E/flutter (32202):接收者:“RemoteMessage”实例 E/flutter (32202):尝试调用:[]("data")。
    • Android 或 iOS 在哪个设备上?
    • 虽然电话收到了消息,但请求的信息不会打印到控制台。有什么建议吗?
    • 我使用的是安卓设备
    • rideRequestId 正在此处打印:I/flutter (32202): {status: done, click_action: FLUTTER_NOTIFICATION_CLICK, id: 1,ride_request_id: -MjY-d-rZl7a6iYBeCNR} I/flutter (32202) : New Ride Request 我希望打印请求中包含的信息,例如实时数据库中包含的接送地点。
    猜你喜欢
    • 2021-11-13
    • 2021-08-29
    • 2021-10-02
    • 2020-12-15
    • 2021-03-23
    • 2021-05-17
    • 2021-07-28
    • 2020-12-27
    相关资源
    最近更新 更多