skip to Main Content

I would like to make a push message list but I can’t find a method to update this list and rebuild my "HomePage".

main()

import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:notification_exemple_4/version/v1/pages/home_page.dart';
import 'package:notification_exemple_4/version/v1/pages/notification_page.dart';
import 'package:provider/provider.dart';

import 'api/firebase_api.dart';
import 'firebase_options.dart';

final navigatorKey = GlobalKey<NavigatorState>();

class MessageModel extends ChangeNotifier {
  List<Widget> _messaging = [];
  List<Widget> get messaging => _messaging;

  void addMessage(RemoteMessage remoteMessage) {
    messaging.add(Text(remoteMessage.messageId.toString()));
    notifyListeners();
  }
}

final MessageModel messageModel = MessageModel();

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message,) async {
  // If you're going to use other Firebase services in the background, such as Firestore,
  // make sure you call `initializeApp` before using other Firebase services.
  await Firebase.initializeApp();

  print("Handling a background message: ${message.messageId}");
}

Future<void> main() async{
  WidgetsFlutterBinding.ensureInitialized();
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    print('Got a message whilst in the foreground!');
    print('Message data: ${message.data}');

    if (message.notification != null) {
      messageModel.addMessage(message);
      print("tp failed");
      /*navigatorKey.currentState?.pushNamed(
        '/home',
        arguments: message,
      );*/
      print('Message also contained a notification: ${message.notification}');
    }
  });


  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  await FirebaseApi().iniNotifications();

  runApp(
      MultiProvider(
        providers: [
          ChangeNotifierProvider(create: (_) => MessageModel()),
        ],
        child: const MyApp(),
      )
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
      navigatorKey: navigatorKey,
      routes: {
        "/home": (context) => const HomePage(),
        "/notification_screen": (context) => const NotificationPage(),
      },
    );
  }
}

on this page i use MessageModel to Stock Message on List for display on call (just for testing)

HomePage()

import 'package:flutter/material.dart';
import 'package:notification_exemple_4/version/v1/main.dart';
import 'package:provider/provider.dart';

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  @override
  Widget build(BuildContext context) {
    print(messageModel.messaging);

    return Scaffold(
      appBar: AppBar(title: const Text("Home Page"),),
      body: SafeArea(
        child: ListView(
          children: context.read<MessageModel>().messaging,
        )
      ),
    );
  }
}

on this page i call my list of message and display on ListView

I try to use Provider package but i not have context in "onMessage.listen()" and on use personnal function but i can’t rebuild my "HomePage".

2

Answers


  1. You should use watch not read:

        return Scaffold(
          appBar: AppBar(title: const Text("Home Page"),),
          body: SafeArea(
            child: ListView(
              children: context.watch<MessageModel>().messaging,
            )
          ),
        );
    
    Login or Signup to reply.
  2. Use ChangeNotifierProvider.value to provide an existing ChangeNotifier.

    final MessageModel messageModel = MessageModel();
    
    ChangeNotifierProvider.value(
      value: messageModel,
      child: ...
    )
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search