۱ محمد زمانی
مقداردهی اولیه ریپازیتوری
جامعه فلاتر ایجاد شده در ۲۸ شهریور ۱۴۰۱

سلام وقت بخیر.

در بخش ریپازیتوری لاگین یک راه مثل آموزش init کردن ریپازیتوری به صورت static داخل همان فایل ریپازیتوری هست.

اما من یک برنامه دارم که baseUrl رو کاربر در صفحه لاگین وارد میکنه و من نمیتونم به صورت static مقداردهی کنم.

از طرفی از provider هم نمیشه استفاده کرد چون تو روت هنوز آدرس سرور مشخص نشده.

راه حل چیه؟تو هر متد هم که منطقی نیست هربار ریپازیتوری رو به خاطر یک url دوباره init کرد.

ممنون میشم راهنمایی کنید.

سلام وقت شما هم بخیر

قطعا برای یک مسئله راه حل‌های متنوعی وجود داره. اما در مورد حالتی که گفتید، یکی از روش‌ها این میتونه باشه که شما برای baseUrl تون یک ValueNotifier تعریف کنید و هروقت کاربر در صفحه ی لاگین url وارد کرد، مقدار جدید به ValueNotifierتون بدید. در قدم دوم، شما می‌تونید به ValueNotifier یک Listener اضافه کنید ( ;({}())urlNotifier.addListener ) و توی اون listener هم برای نمونه Dio تون مقدار جدید baseUrl قرار بدید. کد ضمیمه شده صرفاً برای این هست که فارغ از معماری نرم افزار و اصول clean code و..، منظورم رو بهتر منتقل کنم، ان شالله کمک کننده باشه.


import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
final ValueNotifier<String> url = ValueNotifier<String>('')
var dio = Dio();
class DynamicBaseUrlScreen extends StatefulWidget {
  const DynamicBaseUrlScreen({Key? key}) : super(key: key);
  @override
  State<DynamicBaseUrlScreen> createState() => _DynamicBaseUrlScreenState();
}
class _DynamicBaseUrlScreenState extends State<DynamicBaseUrlScreen> {
  @override
  void initState() {
    super.initState();
    url.addListener(urlListener);
  }
  void urlListener() {
    dio.options.baseUrl = url.value;
    debugPrint('url: ${dio.options.baseUrl}');
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(children: [
        const SizedBox(height: 100),
        Container(
            height: 100,
            color: Colors.grey,
            child: TextField(
              textInputAction: TextInputAction.done,
              keyboardType: TextInputType.url,
              onSubmitted: (value) {
                url.value = value;
              },
            ))
      ]),
    );
  }
  @override
  void dispose() {
    url.removeListener(urlListener);
    super.dispose();
  }
}
بهترین پاسخ
یلدا محصلی ۲۹ شهریور ۱۴۰۱، ۰۸:۲۲