Simon kindly called to my attention, that we can implement the named parameter notFoundHandler (source) with a Handler in the Router constructor, instead of implementing a router.all() (source).

Example

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_router/shelf_router.dart';

void main() async {
  final service = Service();

  final server = await shelf_io.serve(service.handler, 'localhost', 8080);
  print('Server running on http://${server.address.host}:${server.port}');
}

class Service {
  Handler get handler {
    final router = Router(
      //
      // Instead of using 'router.all', that is commented a few lines down, you can also use 'notFoundAl' as implemented here.
      //
      notFoundHandler: (Request request) => Response.notFound('Page not found');
    );

    router.get('/say-hi/<name>', (Request request, String name) {
      return Response.ok('hi $name');
    });

    // Instead of using 'router.all' we can use the 'notFoundHandler'
    // router.all('/<ignored|.*>', (Request request) {
    //   return Response.notFound('Page not found');
    // });

    return router;
  }
}