[Riverpod] ref가 없는 곳에서 ref 쓰기?

2023. 12. 8. 22:20Flutter

반응형

class를 만들다 보니 ref가 없는 class에서 ref를 사용해야 하는 경우가 생겼다

repository에서 provider안 함수를 사용하고싶었다

 

함수함수마다 ref를 전달해 주는 건 아니라 생각해서 다른 방법을 찾았다

 

일단 example class를 작성한다. 

class Example {
  funA() {
    //ref를 사용하고 싶다...
  }
}

funA에서 ref를 사용하기 위해 exampleProvider를 만들어 Example에서 ref를 사용하도록 할 수 있다

import 'package:flutter_riverpod/flutter_riverpod.dart';

final exampleProvider = Provider(Example.new);

class Example {
  final Ref ref;
  Example(this.ref);

  funA() {
  	//ref.~~~ 사용가능
  }
}

 

 

여기서 funA를 다른 위젯에서 사용하려면

 

1. ref를 사용할 수 있는 위젯

class Home extends ConsumerStatefulWidget {
  const Home({super.key});

  @override
  ConsumerState<ConsumerStatefulWidget> createState() => _HometState();
}

class _HometState extends ConsumerState<Home> {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.amber,
      child: Column(
        children: [
          Text("Ref를 사용할 수 있는 곳"),
          Expanded(
            child: Center(
              child: GestureDetector(
                onTap: () => ref.read(exampleProvider).funA(),
                child: Text("BUTTON"),
              ),
            ),
          )
        ],
      ),
    );
  }
}

ref.read를 통해 exampleProvider를 불러 함수를 쓸 수 있다

 

2. ref를 사용할 수 없는 위젯

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

  @override
  Widget build(BuildContext context) {
    final container = ProviderContainer();

    return Column(
      children: [
        Text("Ref를 사용할 수 없는 곳"),
        Expanded(
          child: Center(
            child: GestureDetector(
              onTap: () => container.read(exampleProvider).funA(),
              child: Text("BUTTON"),
            ),
          ),
        )
      ],
    );
  }
}

ProviderContainer를 통해 ref를 만들어 줄 수 있다

반응형